Sub 在自己的字段成员上使用 super's 实例方法



假设我有类SUPERSUB,其中SUB扩展了SUPER。两者都是具体的类别。

有一个实例方法,比如SUPERm1()。CCD_ 7使用该方法中的字段成员CCD_。SUB希望使用SUPER在其自己的字段成员上所做的操作,并在其上添加更多内容

当我在SUB中重写m1()时,我首先可以调用super.m1()。但是,此调用在SUPER对象的字段成员上运行super.m1(),而不是SUB。我需要的是,super.m1()SUB的成员上运行,这样我就不必在重写的方法中重复该代码。然后添加更多——我想在SUBm1()方法中对SUB的成员进行的进一步计算。

因此,在下面的代码中,我希望获得"line-K"中计算对某些成员x的影响,以便打印结果显示661而不是67:

class AAA  {    
    int x=55;
    void m1 () { 
        x*=10; // line-K
//        System.out.println("in m1() of SUPER "+x); 
    } 
}
class NewClass extends AAA  {
    int x = 66; 
    void m1 () {
        super.m1(); 
        x++; 
        System.out.println("in m1() of SUB itself..............."+x); 
    } 
    public static void main(String[] args) throws CloneNotSupportedException {
        NewClass c = new NewClass();        
        c.m1();
    }
} 

可以通过某种方式重写m1()而不在super.m1()中重复该代码来实现这一点吗?

如何?

TIA。

//=========================================

编辑:

我可以将CCD_ 25作为参数传递给方法并返回它——通过使CCD_;返回一个值,从而完成我需要的任务。但这不是我想知道的。

在子类中声明与超类中成员同名的成员的概念称为隐藏。

如果类声明了一个具有特定名称的字段,则该字段的声明被认为隐藏了所有可访问的内容超类中具有相同名称的字段的声明,以及类的超接口。

(方法和字段都有隐藏。)

字段不是多态的。在这种情况下,超级类不知道子类中声明的成员,它绝对不应该知道。这将打破封装。

可以通过某种方式重写m1()而不在super.m1()中重复该代码来实现这一点吗?

没有。您提出的带有额外参数的解决方案似乎是合适的。

以下是获得所需内容的标准方法:

static class AAA  {    
    int x=55;
    void m1 () { 
        setX(getX()*10); // line-K
    } 
    int getX() { return this.x; }
    void setX(int x) { this.x = x; }
}
static class NewClass extends AAA  {
    int x = 66; 
    void m1 () {
        super.m1(); 
        setX(getX()+1); 
        System.out.println("in m1() of SUB itself..............."+getX()); 
    } 
    @Override
    int getX() { return this.x; }
    @Override
    void setX(int x) { this.x = x; }
}     
public static void main(String[] args)
{
    NewClass c = new NewClass();        
    c.m1();
}

实例变量不是虚拟的,但方法是虚拟的。

然而,在子类中隐藏实例变量几乎从来都不是一个好主意。

最新更新