在这个问题中,输出为Rose0。但是当我通过逻辑时,我觉得答案必须是Rose100而不是Rose0。编译器如何区分两个类中的i。由于Rosea延伸_39级,因此它也拥有超级I级。但是在第1行,如果我改变super.i然后我得到Rose100。这有何不同?
class _39 {
int i;
_39(){
i=100;
foo();
}
public void foo(){
System.out.println("Flower"+i);}
}
}
public class Rosea extends _39{
int i=200;
Rosea(){
i=300;
}
public void foo(){
System.out.println("Rose"+i);
} //line 1
public static void main(String[] args) {
new Rosea();
}
}
答案 0 :(得分:5)
首先,子类中的变量i
将隐藏超类中的变量。因此,如果您想访问super.i
,则必须在Rosea
中撰写_39.i
。
第二:即使你在超类中调用foo
,也会调用子类中的实现。
...
_39() {
i = 100;
foo(); <--------------- this calls this
} |
|
... |
|
public class Rosea extends _39 { |
... |
public void foo() { <-------'
System.out.println("Rose" + i);
}
...
}
Rosea.foo
i
引用了Rosea
i
版_39.i
,因为隐藏了{{1}}。
Java中的所有方法都是虚拟的,即它是确定调用哪个方法的对象的运行时类型。 (如果调用是在超级类中进行的话,则为。)
进一步阅读:
答案 1 :(得分:1)
派生类中具有相同名称的变量隐藏基类中的变量。因此,在函数Rosea::foo()
中,将使用派生类的i
。正如您在问题中所写,如果您想使用基类的i
,则必须明确写出super.i
。