繁体   English   中英

在Java中扩展类时重载方法

[英]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 为什么它使用属于TreBx 在这种情况下,范围怎么样?

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

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

你没有得到一份副本,你只是拥有它(你继承了它)并且可以使用它。

无论你在哪里使用x ,它总是从TreA继承的相同变量,所以当TreA.f()修改它时,它正在修改你拥有的唯一x实例。

我从未实例化过TreA

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

您必须认为TreB固有地包含 TreA ,然后您可以添加内容并进行覆盖。

为了更好地可视化情况,这是你的A类:

父母班

这是它的子类B:

儿童班

正如您所看到的,B中的x变量 A类中的变量,而不是副本。

当您实例化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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM