Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java类中的继承_Java_Object_Inheritance_Constructor - Fatal编程技术网

Java类中的继承

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

这段代码的输出是84和42,但无论我如何跟踪它,最终都是84和72。有人能详细解释一下吗。

在第二种情况下,在
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();