所有基本类型数据、对象都会在调用构造函数之前经由系统自动初始化,但是偏偏被final声明的却不行,一定是在调用构造函数之后被调用,谁知道这是因为基于什么原因呢?
class Test{
int a; // a=0
char b; // b=''
float c; //c=0.0
double d; //d=0.0
short e; //e=0
Test1 f; //f=null
//final int g; //erro 因为没初始化
void print(){
System.out.println(a + "");
System.out.println(b + "");
System.out.println(c + "");
System.out.println(d + "");
System.out.println(e + "");
System.out.println(f + "");
}
public static void main(String[] args){
Test test = new Test();
test.print();
}
}
class Test{
int a; // a=0
char b; // b=''
float c; //c=0.0
double d; //d=0.0
short e; //e=0
Test1 f; //f=null
//final int g; //erro 因为没初始化
void print(){
System.out.println(a + "");
System.out.println(b + "");
System.out.println(c + "");
System.out.println(d + "");
System.out.println(e + "");
System.out.println(f + "");
}
public static void main(String[] args){
Test test = new Test();
test.print();
}
}
楼主【llm0528】截止到2008-07-16 11:37:43的历史汇总数据(不包括此帖):
发帖的总数量:55 发帖的总分数:1100 每贴平均分数:20
回帖的总数量:47 得分贴总数量:0 回帖的得分率:0%
结贴的总数量:55 结贴的总分数:1100
无满意结贴数:0 无满意结贴分:0
未结的帖子数:0 未结的总分数:0
结贴的百分比:100.00% 结分的百分比:100.00%
无满意结贴率:0.00 % 无满意结分率:0.00 %
敬礼!
因为它只能初始化一次。 而你的程序里并没有对他初始化就使用了。如果类自动初始化为0,那么你认为如下的代码会怎样呢?class Test{
final int id;
Test(){
id = 1;
}
}如果按照你的理解,那么这个类将报错,因为那个final已经被系统自动初始化了。也就是说,任何你声名为final的,都只能是系统默认的,而不可能被我们的程序控制了。
这个应该不是 final的初衷吧!OVER
2. 拿 final 修饰的实例域必须使用下面两种方式之一进行初始化:
a. 在声明的同时赋上初始值(比如 final int g = 618)
b. 在构造方法中进行初始化(比如 public Test() { this.g = 618; })
如果使用 b 方式要注意:你要保证此类的使用者无论使用那个构造方法无论传入什么参数来创建对象 this.g = 618; 像这样给 final 实例域赋值的语句必须要能执行到,而且只能被执行一次。