如果我有此代码:

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。为什么使用属于xTreB?在这种情况下范围如何?

最佳答案

扩展类意味着您的子类包括父类的所有内容。

我将覆盖它的f()方法并获取int x = 1的副本

您没有得到一个副本,只需拥有它(您继承了它)就可以使用它。

不管在哪里使用x,它始终是从TreA继承的相同变量,因此,当TreA.f()对其进行修改时,它就是在修改您拥有的x的唯一实例。

我从未实例化TreA

创建子类意味着您也在创建父类。创建子类时,将自动调用其构造函数。

您必须像TreB一样固有地思考包含 TreA,然后可以向其中添加内容并进行覆盖。

为了更好地显示情况,这是您的A类:

java - 在Java中扩展类时方法的重载-LMLPHP

这是它的子类B:

java - 在Java中扩展类时方法的重载-LMLPHP

如您所见,B中的x变量,它来自A类,而不是副本。

09-10 10:08