本帖最后由 翁游龙 于 2012-6-29 15:16 编辑
在一些书上看到,程序可以在3个地方对实例变量执行初始化:
1)定义实例变量时指定初始值;
2)非静态初始化块中对实例变量指定初始值;
3)构造器中对实例变量指定初始值
其中第1、2种方式比第3种方式更早执行,但第1、2种方式的执行顺序与它们在源程序
中的排列顺序相同,这些都能理解。可下面有个程序不是很理解:
class Cat{
String name;
int age;
//使用构造器初始化name、age两个实例变量
public Cat(String name, int age){
System.out.println("---执行构造器");
this.name = name;
this.age = age;
}
{
System.out.println("===执行非静态初始化块");
weight = 2.0;
}
//定义时指定初始值
double weight = 2.3;
public String toString(){
return "Cat[name=" + name + ",age=" + age + ",weight=" + weight +"]";
}
}
public class InitTest{
public static void main(String[] args){
Cat cat = new Cat("kitty", 2);
System.out.println(cat);
}
}
上面程序使用了三种初始化方式,有个不明白的地方就是:
(1)如果是按照正常的执行流程,为什么变量weight在没定义之前就可以在代码快中使用,
而且程序没有报错,正常执行了。结果为:
===执行非静态初始化块
---执行构造器
Cat[name=kitty,age=2,weight=2.3]
(2)如果是先执行double weight = 2.3;这句,再执行代码快中的代码,那为什么weight
输出结果不是2.0而是2.3?
|