为什么我的子类没有在java中正确初始化变量

时间:2011-05-30 04:55:13

标签: java subclass

在下面的代码中,myString始终初始化为null。我必须手动初始化init()或类似的。据我所知,它与超类/子类有关,但我不明白确切的机制

public class A extends B {

    private String myString = "test";


    public static void main(String[] args) {
        new A();
    }

    public A() {
        super();

    }

    public void c() {
        System.out.println(myString);
    }

}

public class B {

    public B() {
        c();
    }

    public void c() {

    }
}

3 个答案:

答案 0 :(得分:3)

您的代码存在的问题是,myString在类A的构造函数的开头初始化,而超级构造函数之后(即类{{1} }})。由于您之前从类B的构造函数访问变量(间接通过调用重写方法B),因此会出现此行为。

根据经验:如果你想避免意外行为,在构造函数执行之前不要调用overriden方法。

答案 1 :(得分:0)

在完全创建对象后立即调用c();重写方法,并完成对超类构造函数的调用。

将您的代码更改为此..

public class A extends B {

    private String myString = "test";


    public static void main(String[] args) {
        new A();
    }

    public A() {
        super();
         c();     // Include the call to c(); here ...

    }

    public void c() {
        System.out.println(myString);
    }

}

public class B {

    public B() {

    }

    public void c() {

    }
} 

 // Output : test

答案 2 :(得分:0)

Bruce Eckel在Java第二版中的思考,多态方法的行为 内部构造函数(p.337-339)。