假设我有类SUPER
和SUB
,其中SUB
扩展了SUPER
。两者都是具体的类别。
有一个实例方法,比如SUPER
的m1()
。CCD_ 7使用该方法中的字段成员CCD_。SUB
希望使用SUPER
在其自己的字段成员上所做的操作,并在其上添加更多内容
当我在SUB
中重写m1()
时,我首先可以调用super.m1()
。但是,此调用在SUPER
对象的字段成员上运行super.m1()
,而不是SUB
。我需要的是,super.m1()
在SUB
的成员上运行,这样我就不必在重写的方法中重复该代码。然后添加更多——我想在SUB
的m1()
方法中对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();
}
实例变量不是虚拟的,但方法是虚拟的。
然而,在子类中隐藏实例变量几乎从来都不是一个好主意。