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

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐