Java Inherit,为什么打印输出结果为空?

Java Inherit,为什么打印输出结果为空?,java,inheritance,Java,Inheritance,下面是代码,我以为结果是“B”,因为方法“a()”被覆盖了,但结果是“null”,我真的不明白为什么。有人能解释一下吗?多谢各位 public class HelloWorld { public static void main(String[] args) { B b = new B(); } } class A{ private String name = "A"; // "public" will have the same outcome

下面是代码,我以为结果是“B”,因为方法“a()”被覆盖了,但结果是“null”,我真的不明白为什么。有人能解释一下吗?多谢各位

public class HelloWorld {

    public static void main(String[] args) {
        B b = new B();
    }
}

class A{
    private String name = "A"; // "public" will have the same outcome

    public A()
    {
        a();
    }

    public void a(){
        System.out.println(name);
    }

}

class B extends A{  
    private String name = "B";

    public void a()
    {
        System.out.println(name);
    }

}

因为您没有在主函数中调用方法a()

只需在初始化类b之后添加b.a()。 你会得到你的结果


谢谢你的快乐编码;)

因为您没有在主函数中调用方法a()

只需在初始化类b之后添加b.a()。 你会得到你的结果


谢谢你的快乐编码;)

我不确定,但我猜原因是实例变量初始化时

子类的构造函数隐式调用超类的构造函数。我重新编写了B类的构造函数,如下所示,以使事情更清楚:

public void B()
    {
       super();
       System.out.println(name);
    }
执行
super()
语句,代码流跳转到类A的构造函数。由于多态性,在类A的构造函数中执行
A()
语句将跳转到类B的方法
A()。此时,B类的变量
name
尚未初始化,因此它打印null(字符串变量的默认值)

完成
super()
语句后,现在初始化变量
name
。据我所知,在调用
super()
之后,实例变量将被赋值。然后在下一个
println
语句中,它打印我们分配给
name
的字符串。
您的源代码没有
println
语句,因此它只打印
null

我不确定,但我猜原因是实例变量初始化时

子类的构造函数隐式调用超类的构造函数。我重新编写了B类的构造函数,如下所示,以使事情更清楚:

public void B()
    {
       super();
       System.out.println(name);
    }
执行
super()
语句,代码流跳转到类A的构造函数。由于多态性,在类A的构造函数中执行
A()
语句将跳转到类B的方法
A()。此时,B类的变量
name
尚未初始化,因此它打印null(字符串变量的默认值)

完成
super()
语句后,现在初始化变量
name
。据我所知,在调用
super()
之后,实例变量将被赋值。然后在下一个
println
语句中,它打印我们分配给
name
的字符串。
您的源代码没有
println
语句,因此它只打印
null

您没有在此处调用重写的方法。这就是为什么它不打印“B”。您将得到“null”作为答案,因为当时两个名称对象都被隐藏,因为您为这两个类创建了具有相同标识符的对象。

您没有在此处调用重写的方法。这就是为什么它不打印“B”。您将得到“null”作为答案,因为当时两个名称对象都是隐藏的,因为您为这两个类创建了具有相同标识符的对象。

此代码运行良好,请记住一条黄金法则:不要从构造函数调用重写的方法

A
初始化时,它调用
A.A()
,其中
A()
在子类
B
中被重写,但该类尚未初始化,因此所有参数都有其默认值

最好用两个电话分开

B b = new B();  // init all classes completely to avoid unobvious states
b.a();          // do what you want
p.S.


你的代码运行得很好,但这是一次很好的面试。在现实生活中,最好避免这些情况。

这段代码运行良好,请记住一条黄金法则:不要从构造函数调用重写的方法

A
初始化时,它调用
A.A()
,其中
A()
在子类
B
中被重写,但该类尚未初始化,因此所有参数都有其默认值

最好用两个电话分开

B b = new B();  // init all classes completely to avoid unobvious states
b.a();          // do what you want
p.S.


你的代码运行得很好,但这是一次很好的面试。在现实生活中,最好避免这些情况。

似乎它应该按照预期的方式工作,基于感谢,似乎它应该按照预期的方式工作,但我并不是说我希望结果是“A”,我只是想理解这背后的逻辑…@你理解逻辑了吗,还是仍然困惑?谢谢,但我并不是说我希望结果是“A”,我只是想理解这背后的逻辑…@@@n你理解逻辑了吗?还是仍然困惑?谢谢,我不会,这实际上不是我的代码。。这是我在一本非常古老的java书上发现的一个问题。Lolzt这只是一个例子。这是一个很好的例子,说明你不应该写代码。谢谢你,我不会,这实际上不是我的代码。。这是我在一本非常古老的java书上发现的一个问题。Lolzt这只是一个例子。这是一个很好的例子,说明你不应该写代码。