有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

初始化成员时使用java?

考虑以下类:

public class A {
    String bar = "A.bar";

    A() { foo(); }

    public void foo() {
        System.out.println("A.foo(): bar = " +
        bar);
    }
}


public class B extends A {
    String bar = "B.bar";

    B() { foo(); }

    public void foo() {
        System.out.println("B.foo(): bar = " +
        bar);
    }
}

public class C {
    public static void main(String[]
    args) {
        A a = new B();
        System.out.println("a.bar = "
        + a.bar);
        a.foo();
    }
}

现在,打印的第一行是:B.foo(): bar = null。据我所知,成员初始化在构造函数之前,但我可以看到这里的情况并非如此

为什么在这个阶段B#bar没有初始化
isB#bar何时初始化

谢谢

更新:
在阅读了你的答案后,请看一下这个反例:

public class Bazz {

    public int a = 42;

    public Bazz() {
        System.out.println(a);
    }

    public static void main(String[] args) {
        Bazz bazz = new Bazz();
    }
}

在这种情况下,a不是0。相反,Bazz()的构造函数打印42
有什么区别


共 (1) 个答案

  1. # 1 楼答案

    命令如下:

    1. 初始化A.bar
    2. 执行A的构造函数
    3. 初始化B.bar
    4. 执行B的构造函数

    请注意barin AB中的bar是不同的变量。因为A的构造函数调用了一个重写的方法,所以这个方法可以在初始化前访问B中的实例变量