请考虑以下课程:
public interface BaseInterface {
void method1();
void method2();
void method3();
}
public class BaseClass implements BaseInterface {
@Override
public void method1() {
System.out.println("BaseClass.method1 IN");
this.method3();
System.out.println("BaseClass.method1 OUT");
}
@Override
public void method2() {
System.out.println("BaseClass.method2 IN");
System.out.println("BaseClass.method2 OUT");
}
@Override
public void method3() {
System.out.println("BaseClass.method3 IN");
System.out.println("BaseClass.method3 OUT");
}
}
public class ChildClass extends BaseClass {
@Override
public void method1() {
System.out.println("ChildClass.method1 IN");
super.method1();
System.out.println("ChildClass.method1 OUT");
}
@Override
public void method2() {
System.out.println("ChildClass.method2 IN");
super.method2();
System.out.println("ChildClass.method2 OUT");
}
@Override
public void method3() {
System.out.println("ChildClass.method3 IN");
System.out.println("ChildClass.method3()");
System.out.println("ChildClass.method3 OUT");
}
}
在这种情况下,如果我创建
ChildClass
的实例:BaseInterface cc1 = new ChildClass();
然后运行该类的
method1
cc1.method1();
它将返回以下输出:
ChildClass.method1 IN
BaseClass.method1 IN
ChildClass.method3 IN
ChildClass.method3()
ChildClass.method3 OUT
BaseClass.method1 OUT
ChildClass.method1 OUT
因此,当我从超类(
this.method3()
)调用method3()
(或只是BaseClass
)时,将执行method3
的ChildClass
。我知道这是预期的行为,但我只是想知道如何在此设置中仍然调用BaseClass.method3
?这可能吗?请注意,这纯粹是理论上的问题,我了解实际上我可能应该首先实例化
BaseClass
实例。这是解决这个问题的唯一方法吗? 最佳答案
解决方法是在BaseClass
中创建一个私有方法,然后从method3
调用它,如下所示:
public class BaseClass implements BaseInterface {
@Override
public void method1() {
System.out.println("BaseClass.method1 IN");
this.internalMethod3();
System.out.println("BaseClass.method1 OUT");
}
@Override
public void method2() {
System.out.println("BaseClass.method2 IN");
System.out.println("BaseClass.method2 OUT");
}
private void internalMethod3() {
System.out.println("BaseClass.method3 IN");
System.out.println("BaseClass.method3 OUT");
}
@Override
public void method3() {
this.internalMethod3();
}
}
将完成同一件事
另外,对How to call a superclass method using Java reflection中发布的解决方案的评论是,如果可能的话,您就不应该这样做。重构代码将其分解为较小的功能将是解决问题的方法。由于提出了这个问题,因此重构代码没有问题。