本帖最后由 xuemeng 于 2013-5-14 20:31 编辑
哈!!
楼主, 我懂你的意思了!!
其实你所说位置是有关系的, 这个涉及初始化对象的顺序
new对象时, 会先加载这个对象的类, 当这个类被加载时, 首先为静态属性赋值为默认值, 然后调用静态显示初始化语句和静态代码块中的代码, 它们的顺序是按从上到下的顺序执行; 然后为实例属性赋值为默认值, 然后再调用实例显示初始化语句和实例块, 它们二者也是按从上到下的顺序执行的, 最后执行构造器里面的代码. 如下面验证代码:
class Person {
Person() {
System.out.println("构造器");
}
P p1 = new P("实例属性p1");
{
System.out.println("构造代码块1");
}
{
System.out.println("构造代码块2");
}
P p2 = new P("实例属性p2");
static P p3 = new P("静态属性p1");
static {
System.out.println("静态初始化块1");
}
static {
System.out.println("静态初始化块2");
}
static P p4 = new P("静态属性p2");
}
class P {
P(String p) {
System.out.println(p);
}
}
class Demo {
public static void main(String[] args) {
new Person();
}
}
关于你的代码, 因为实例块(构造代码块) 和显示初始化属性的执行顺序是平级的, 所以他们执行的顺序是按从上到小的顺序执行的, 所以你的代码 public String name ="heima" 这个代码写在1位置和2位置有很大的区别,:
如果写在1的位置, 那么当创建对象, 打印这个属性时, 那么打印的值是java, 因为程序首先给name赋值为 heima, 然后接着有执行构造代码快中的赋值,那么name的值就变成那个了java,
如果写在2的位置,那么当创建对象时 ,首先是执行构造代码块中的代码, name的被赋值为java, 然后接着执行 public String name = "heima";,name被赋值为heima, 所以这个时候如果打印属性的值的话, 那么打印结果是heima |