[英]Overloading of methods when extending classes in Java
如果我有这个代码:
interface Tre{
public void f();
}
public class TreA implements Tre{
int x = 1;
public void f(){
x++;
System.out.println("Y"+x);
}
public static void main(String[] a){
Tre a3 = new TreB(); a3.f();
}
}
class TreB extends TreA{
public void f(){
x--;
super.f();
System.out.println("X"+x);}
}
我不明白为什么输出是Y1 X1
。 如果我扩展了TreA
类,我将覆盖它的f()
方法并获得int x=1
的副本。 调用super.f()
应该调用属于TreA
类的f()
但是x
呢? 我从未实例化过TreA
。 为什么它使用属于TreB
的x
? 在这种情况下,范围怎么样?
当您实例化TreB时,会构建TreA(更具体地说,这是TreB)。 TreB没有字段x将字段隐藏在TreA中,因此该对象只有一个字段x,在TreA中定义。 您可以从TreB访问此内容,因为您没有将其声明为私有。
这是不好的做法btw,非final字段应该始终是私有的,以避免这样的问题。 使用getter从TreA获取值以用于TreB。
无论何时从任何地方调用该类,变量都会自我实例化。 调用默认构造函数并设置变量的值。
你可以看到这个例子。 调用该类时设置变量值。
public class TreA {
int x = 1;
public static void main(String[] a){
TreA b = new TreA();
System.out.println(b.x);
}
}
输出为1
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.