Java类中的继承
这段代码的输出是84和42,但无论我如何跟踪它,最终都是84和72。有人能详细解释一下吗。在第二种情况下,在Java类中的继承,java,object,inheritance,constructor,Java,Object,Inheritance,Constructor,这段代码的输出是84和42,但无论我如何跟踪它,最终都是84和72。有人能详细解释一下吗。在第二种情况下,在Foo-bar=new-bar(42,24)对于超级(x) 间接地Foo#multiply()在第二种情况下对Foo中的number无效。所以,multiply(),此时Foo中的x编号保持不变,即42。i、 e.Bar(100,24)将为您提供编号100 您没有覆盖栏中的getNumber,您将从Foo中获得number,即42 值得注意的是,Bar中的number现在是72,这是因为n
Foo-bar=new-bar(42,24)代码>对于超级(x)
间接地Foo#multiply()代码>在第二种情况下对Foo
中的number
无效。所以,multiply()在Foo
的构造函数中调用Bar
的code>,此时Foo
中的x
编号保持不变,即42
。i、 e.Bar(100,24)
将为您提供编号100
您没有覆盖栏中的getNumber
,您将从Foo
中获得number
,即42
值得注意的是,Bar
中的number
现在是72
,这是因为number=y
和Bar
的乘法方法没有使用
您的Foo
的构造函数与类似
public Foo(int x) {
number = x;//Now number in Foo is 42
multiply();// of Bar will be called not of Foo
//but currently number is 0 in Bar
}
以下是一个跟踪:
调用新条(42,4)
:
42
被传递给super
构造函数。因此,它执行以下主体:
public Foo(int x) {
number = x;
this.multiply();// In second case 'this' refers to Bar and not Foo
//So that control goes to multiply method of Bar and not Foo
}
它使用的number
是它自己的number
(隐藏的Foo.number
),但它调用的multiply()
是被覆盖的。因此,它呼吁:
public Foo(int x) {
number = x;
multiply();
}
但这指的是Bar.number
,在这个阶段,由于尚未初始化,它仍然是0
。所以它仍然是0。Foo
中的number
不受影响,因为这不是此版本的multiply
中出现的number
因此,目前我们有42处的Foo.number
,以及0处的Bar.number
我们接下来继续
public void multiply() {
number = number * 3;
}
它将24放入条形图中。数字
,然后乘以3
但是getNumber()
不会被覆盖。这意味着,当您调用bar.getNumber()
时,实际上是从其中的Foo
中获取number
。它是42。你能告诉我如何追踪它得到72吗?24*3确实是72。我看不出这里有什么问题?在语句Foo-bar=new-bar(42,24)中;调用Bar的构造函数,它调用Foo的构造函数,它调用将Foo.number加倍的乘法函数。然后Bar.number应设为72,因为在其构造函数中调用了multiply,该构造函数将值增加三倍。然而,答案是42。不是72。@Stultuske,当我编译时,答案是84和42。不是84和72基本上,Bar.number
正在隐藏Foo.number
。您有两个独立的字段。这很令人困惑,正如你所知……尽管24*2
不是42
。这家伙绝对正确。它变为42,因为超级(x)
public void multiply() {
number = number * 3;
}
number = y;
multiply();