如果我有此代码:
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()
应该调用属于f()
类的TreA
,但是x
呢?我从未实例化TreA
。为什么使用属于x
的TreB
?在这种情况下范围如何? 最佳答案
扩展类意味着您的子类包括父类的所有内容。
我将覆盖它的f()方法并获取int x = 1的副本
您没有得到一个副本,只需拥有它(您继承了它)就可以使用它。
不管在哪里使用x
,它始终是从TreA
继承的相同变量,因此,当TreA.f()
对其进行修改时,它就是在修改您拥有的x
的唯一实例。
我从未实例化TreA
创建子类意味着您也在创建父类。创建子类时,将自动调用其构造函数。
您必须像TreB
一样固有地思考包含 TreA
,然后可以向其中添加内容并进行覆盖。
为了更好地显示情况,这是您的A类:
这是它的子类B:
如您所见,B中的x
变量是,它来自A类,而不是副本。