时间:2021-05-19
final变量的初始化位置
一是其定义处,也就是说在final变量定义时直接给其赋值,
二是在构造函数中。而且在Java1.1以前,只能是在定义时给值。
三是在初如化代码块中{} 或者 static{}
复制代码 代码如下:
public class InitOrder {
{
System.out.println("before---field");
//System.out.println("d1="+d1);
d1 = 3;
//System.out.println("d1="+d1);
}
static {
System.out.println("before---static field");
//System.out.println("d2="+d2);
d2 = 3;
//System.out.println("d2="+d2);
}
final int a1 = 1;
final int b1;
final int c1;
final int d1;
//final int e1;
static final int a2 = 1;
//static final int b2;
static final int c2;
static final int d2;
//static final int e2;
{
System.out.println("after---field");
//System.out.println("c1="+c1);
c1 = 4;
System.out.println("c1="+c1);
//e2 =3;
}
static {
System.out.println("after---static field");
//System.out.println("c2="+c2);
c2 = 4;
System.out.println("c2="+c2);
//e1 = 3;
}
public InitOrder() {
b1 = 2;
//b2 = 2;
}
public static void main(String[] args) {
InitOrder order = new InitOrder();
System.out.println("c1="+order.c1);
System.out.println("c2="+order.c2);
System.out.println("d1="+order.d1);
System.out.println("d2="+order.d2);
}
}
说明:上述所有注释皆为有语法错误
输出结果:
before---static field
after---static field
c2=4
before---field
after---field
c1=4
c1=4
c2=4
d1=3
d2=3
结果分析:
1. 对比a1,a2基本没有什么问题,定义时就初始化
2. 对比b1,b2在构造函数中初始化,b1没有问题,b2有问题,这是因为构造函数的调用在静态变量的后面而b2是静态的,所以会报错
3. 对比c1,d1发现初始化没有问题,有问题的是使用输出语句。对于d1在初始化代码块中不论在哪加输出语句都会报错,这是因为d1所在的初始化代码块位置在变量d1定义的前面,而java中变量的初始化顺序是见Java中变量的初始化顺序, 普通变量和初始化代码块的初始化顺序是按照位置的先后的所以输出用到了d1变量,所以出错,但有一点我不明白,为什么在这里初始化d1不报错,而且在main函数中还可以调用它,难道这个也要去看一下java虚拟机?对于c1在后面加输出语句没有问题。前面加有问题很好理解,就是大之前没有被初始化.
4. 对于c2,d2是和3同样的道理
5. 对于e1放在静态代码块中显然不行,因为静态代码块最先加载,那时e1还没有加
6. 对于e2也是,普通代码块的加载要晚于静态变量,所以也是不行的。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
final可以修饰类,成员变量,局部变量和方法。1.final修饰成员变量1.final成员变量的初始化对于final修饰的变量,系统不会默认初始化为0fina
•final变量如果在变量前加final关键字,则这个变量一旦被初始化,便不可再改变。如果一个final变量是类成员变量,则必须被初始化,且只能被初
首先,说说final。final关键字可以修饰变量,方法,类。final变量:需求:1需要一个永不改变的编译时常量2一个运行时被初始化的值,不希望被更改好处:编
final修饰符:final修饰成员变量必须有程序员显示指定初始值。类的Field:必须在静态初始化块中或声明该Field时指定初始值。实例Field:必须在非
final在Java中可以声明成员变量、方法、类以及本地变量。一旦你将引用声明作final,你将不能改变这个引用了,如果你试图将变量再次初始化的话,编译器会报编