[英]Calling superclass method in superclass
我无法找到一个很好的总结来描述我的问题(建议欢迎)
我有以下两个课程:
测试1
import java.lang.reflect.Method;
abstract class Test1 {
boolean condition = true;
public void f() {
System.out.println("Test1 : f");
}
public void g() {
System.out.println("Test1 : g");
f();
if (condition) {
f(); // call Test1.f() here. HOW?
// Following didn't work
try {
Method m = Test1.class.getDeclaredMethod("f");
m.invoke(this);
} catch (Exception e) {
System.err.println(e);
}
}
}
}
TEST2
class Test2 extends Test1 {
public void f() {
System.out.println("Test2 : f ");
}
public static void main(String[] args) {
Test2 t2 = new Test2();
t2.g();
}
}
输出是:
Test1 : g
Test2 : f
Test2 : f
Test2 : f
问题是由于Test1
的condition
字段给出了一些特殊条件,我想在g()
调用Test1
的f()
,即使我使用Test2
的对象进行调用。
我尝试过反射但它也不起作用。 有什么建议?
编辑1:我没有具体提到它,但如果你仔细看,Test1是抽象的。 所以我无法创建它的对象。
您应该认真考虑您要构建的逻辑。 您尝试覆盖子类中的方法f的原因确定了它背后的原因。
或者,您可以将boolean值作为方法f的返回值,并在子方法中使用boolean r = super.f(); if(r){//execute child logic.}
boolean r = super.f(); if(r){//execute child logic.}
这应该可以解决你的问题。
我的理解。
你的问题:
如果g()
在Test1
类中调用方法f()
那么为什么它运行子(Test2)类的f()
。
答案:来自JLS-8.4.8.1
子类Test2声明了一个方法f()
,它覆盖了Test1的方法f()
。 它继承了Test1类中的方法g()
。
关于这个例子中覆盖的关键点是,在类Test1中声明的方法g()
调用当前对象this
定义的f()
方法,该方法不一定是类Test1中声明的f()
方法。
因此,当g()
是在主要使用的Test2对象T2,的调用调用f()
在体g()
方法是的调用f()
对象T2的。 这允许Test1的子类改变f()
方法的行为而不重新定义它。
震荡:
因此,如果某个类覆盖其父级的某些方法,那么契约说,设计为扩展的Test1应该清楚地指出该类与其子类之间的契约,并且应该清楚地表明子类可以覆盖f()
方法通过这种方式。
在Test1中添加方法f2:
private void f2() {
System.out.println("Test1 : f");
}
public void f() {
this.f2()
}
这样,当条件为真时,您可以调用f2()。
如果方法名称相同,则无法执行此操作。
其他方法可以通过使用super.f()直接在子类中调用超类方法。
UPD:特别针对那个不太注意的人,我正在给出解释。
在下面的代码中,我使用方括号{ }
创建新的匿名类。 这允许我创建子类Test1
新实例。
而不是使用reflection
你可以做这样有趣的事情:
public void g() {
System.out.println("Test1 : g");
f();
if (condition) {
new Test1(){}.f();
}
}
唯一的缺点是f()
方法调用这种方式是绝对另一个对象的方法的调用。
继承只允许您继承super.f()
行为,覆盖它@Override
或两者
@Override
public void f(){
super.f();
//do something
}
你不能覆盖一个方法,然后尝试在覆盖之前调用parents方法状态。 继承不是那样的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.