Java Inherit,为什么打印输出结果为空?
下面是代码,我以为结果是“B”,因为方法“a()”被覆盖了,但结果是“null”,我真的不明白为什么。有人能解释一下吗?多谢各位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
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这只是一个例子。这是一个很好的例子,说明你不应该写代码。