1、Java虚拟机会将所有的初始化动作手机到<init>()方法中,在分配内存后,就开始调用<init>()方法,其中,成员变量的初始化在构造函数里的初始化动作之前。
public class Test {
private String s = "1";
public Test() {
s = "2";
}
public static void main(String[] args) {
Test t = new Test();
System.out.println(t.s); // 输出2
}
}
2、对于有继承的情况,实例化子类时,子类的<init>()方法中第一步是调用父类的<init>()方法,<init>()方法中,成员变量初始化是在构造初始化之前,但是这个例子中由于多态特性,调用到了子类,此时子类的数据还没有初始化,所以输出是null。
public class Base {
private String baseName = "base";
public Base() {
callName();
}
public void callName() {
System.out.println(baseName);
}
static class Sub extends Base {
private String baseName = "sub";
public void callName() {
System.out.println(baseName);
}
}
public static void main(String[] args) {
Base b = new Sub(); // 输出null
}
}