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}}