Java SE 第二十四讲----static与final使用陷阱关键字
1.对于final类型成员变量,一般来说有两种赋值方式;
a)在声明final类型的成员变量时就附上初值
package com.cl.staticandfinal;
public class FinalTest4 {
final int a=7;
public FinalTest4(){
}
}
b)在声明final类型的成员变量时不赋初值,但在类的所有构造方法中都为其赋上初值
package com.cl.staticandfinal;
public class FinalTest4 {
final int a;
public FinalTest4(){
a = 0;
}
}
2.static代码块:静态代码块。静态代码块的作用也是完成一些初始化工作。首先执行静态代码块。然后执行构造方法。静态代码块在类被加载的时候执行,而构造方法是在生成对象的时候执行,要想调用某个类来生成对象,首先需要将类加载到java虚拟机上(JVM),然后由JVM加载这个类来生成对象。
package com.cl.staticandfinal;
public class StaticTest4 {
public static void main(String[] args) {
P p = new P();
P p1 = new P();
}
}
class P
{
static
{
System.out.println("static block");
}
public P(){
System.out.println("p");
}
}
输出结果:
static block
p
p
解析:静态代码块在类加载到jvm就执行了,且静态代码块加载一次就行
3.类的静态代码块只会执行一次,是在类被加载的时候执行的,因为每个类只会被加载一次,所以静态代码块也只会被执行一次;而构造方法则不然,每次生成一个对象的时候都会调用类的构造方法,所以new一次就会调用构造方法一次。
4.如果继承体系中既有构造方法,又有静态代码块,那么首先执行最顶层的类的静态代码块,一直执行到最底层的静态代码块,然后再去执行最顶层类的构造方法,一直执行到最底层的构造方法。注意:静态代码块只执行一次。
package com.cl.staticandfinal;
public class StaticTest4 {
public static void main(String[] args) {
new S();
new S();
}
}
class P
{
static
{
System.out.println("P static block");
}
public P(){
System.out.println("P constructor ");
}
}
class Q extends P{
static
{
System.out.println("Q static block");
}
public Q(){
System.out.println("Q constructor");
}
}
class S extends Q{
static{
System.out.println("S static block");
}
public S(){
System.out.println("S constructor");
}
}
输出结果:
P static block
Q static block
S static block
P constructor
Q constructor
S constructor
P constructor
Q constructor
S constructor
5.在静态方法里不能访问一个非静态的成员变量
package com.cl.staticandfinal;
public class StaticTest5 {
public static void main(String[] args) {
W.change();
}
}
class W
{
int a = 10;
public static void change(){
a++;//编译错误:Cannot make a static reference to the non-static field a
}
}
解决办法:将int a = 10;改成 static int a = 10;
解析:change是一个静态方法,可以通过类的名字去调用,即W.change,但是每次调用都会有一个对象,不知道a++要执行哪个a
6.不能再静态方法中访问非静态成员变量,可以在静态方法中访问静态的成员变量。可以在非静态方法中访问静态的成员变量。
总结:静态的只能访问静态的,非静态的可以访问一切。
package com.cl.staticandfinal;
public class StaticTest5 {
public static void main(String[] args) {
W w = new W();
w.change();
}
}
class W
{
static int a = 10;
public void change(){
a++;
}
}
输出:11
Java SE 第二十四讲----static与final使用陷阱关键字的更多相关文章
- Java SE 第二十二讲----接口interface
1.接口:interface:接口的地位等同于class,接口中的所有方法都是抽象方法.在声明接口中的方法的时候,可以使用abstract关键字也可以不使用.通常情况下,都会省略掉abstract关键 ...
- “全栈2019”Java多线程第二十四章:等待唤醒机制详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- Java SE 第二十三讲----static关键字and final关键字
1.static关键字 [在二十二讲视频中30分钟开始讲授] 2.static修饰属性:无论一个类生成了多少个对象,所有这些对象共同使用唯一一份静态的成员变量:一个对象对该静态成员变量进行了修改,其他 ...
- 趣谈Linux操作系统学习笔记:第二十四讲
一.小内存的分配基础 1.kmem_cache_alloc_node的作用 通过这段代码可以看出,它调用了kmem_cache_alloc_node函数,在task_struct的缓存区域task_s ...
- MySQL实战45讲学习笔记:第二十四讲
一.引子 在前面的文章中,我不止一次地和你提到了 binlog,大家知道 binlog 可以用来归档,也可以用来做主备同步,但它的内容是什么样的呢?为什么备库执行了 binlog 就可以跟主库保持一致 ...
- 菜鸡的Java笔记 第二十四 - java 接口的基本定义
1.接口的基本定义以及使用形式 2.与接口有关的设计模式的初步认识 3.接口与抽象类的区别 接口与抽象类相比,接口的使用几率是最高的,所有的 ...
- Java SE 第十六讲----面向对象特征之继承
1.继承(inheritance):Java是单继承的,意味着一个类只能从另一个类继承(被继承的类叫做父类也叫[基类 baseclass]),继承的类叫做子类,java中的继承使用extends关键字 ...
- Java SE 第十六讲----面向对象特征之多态
1.多态:polymorphism:我们说的子类就是父类(玫瑰是花,男子是人),因此多态的意思就是:父类型的引用可以指向子类的对象 public class PolyTest { public sta ...
- Java SE 第十六讲----方法重载
1.方法重载(Overload):表示两个或多个方法名字相同,但方法参数不同 不同:1)参数个数不同: 2)参数类型不同: 注意:方法的返回值对重载没有任何影响 2.构造方法重载,只需看参数即可.如果 ...
随机推荐
- SQL server 2008 Express Edition实现自动备份和自动删除备份
1.查看SQL 版本: select @@VERSION --可以看到 Express Edition 精简免费版 Microsoft SQL Server 2008 R2 (SP2) - 10.50 ...
- linux包之coreutils之du和df命令
[root@localhost ~]# rpm -qf /usr/bin/ducoreutils-8.4-31.el6.x86_64[root@localhost ~]# rpm -qf /bin/d ...
- CSS深入之label与input对齐!
我想很多人都会碰到label与input 对齐的问题. 这个东西本身不难,但是要做到与IE这个东西兼容确实有点头疼. 参考各大门户网站的前端源码. 得一方法,以记录之: html确实很简单: 帐号 输 ...
- [java]序列化框架性能对比(kryo、hessian、java、protostuff)
序列化框架性能对比(kryo.hessian.java.protostuff) 简介: 优点 缺点 Kryo 速度快,序列化后体积小 跨语言支持较复杂 Hessian 默认支持跨语言 较慢 Pro ...
- Winform用匿名方法新建线程的方法
作用:1.将耗时的操作放在单独的线程,加快UI的响应速度.Thread t = new Thread(delegate() { parse.ParseDay(StockCode, FileName); ...
- [转]String.getBytes()和new String()
在Java中,String.getBytes(String decode)方法会根据指定的decode编码返回某字符串在该编码下的byte数组表示,如 byte[] b_gbk = "中&q ...
- java书箱
http://www.blogjava.net/kuuyee/archive/2013/06/03/400084.html http://www.blogjava.net/cheneyfree/
- 01TCP/IP基础
ISO/OSI参考模型: OSI(open system interconnection)开放系统互联模型是由ISO(International Organization for Standardiz ...
- of
“查询序列的一个元素” 1. an element of the query sequence (T) 2. an query sequence element (T) "查询序列或者候选序 ...
- IntelliJ IDEA常用快捷键
双击shift 项目所有目录查找 ctrl+f 文件查找特定内容 ctrl+shift+f 项目查找包含特定内容的文件 ctrl+n 新建类 ctrl+shift+n 查找文件 ctrl+e 最近的 ...