Java,隐式调用重写方法

Mik*_*ike 2 java oop inheritance

现在在一些Java代码中,我有类似的东西

class A {
 void f() {

 }
 A() {
  f();
 }
}

class B extends A{
 @Override
 void f() {
  //do some stuff
  super.f();
 }
}

class C extends B {
 @Override
 void f() {
  //do some stuff
  super.f();
 }
}
Run Code Online (Sandbox Code Playgroud)

我希望f()调用然后向上遍历每个父类,运行重写f().super.f()虽然我不想这样做,但是我通过明确地调用来做到这一点.

我这样做的原因是必须在到达A中的构造函数之后进行后处理.并且每个班级都有适当的初始状态,这就是为什么我们有向上的痕迹f().

所以构造函数A真的是

A() {
  //init some state in a
  f(); //run f(), which will depend on the previous operation
}
Run Code Online (Sandbox Code Playgroud)

如果我做了new C();我想要C.f()调用的东西,那么B.f()调用,然后A.f()调用

无论如何,如果有更聪明的方法,我会接受它.

Jon*_*eet 8

在构造函数中调用非final方法通常是一个坏主意 - 至少,我建议你大量记录它.请记住,当调用f()时,不会调用C的构造函数 - 也不会调用任何变量初始值设定项.该对象只是半初始化,因此需要非常仔细地编写方法.

super.f()虽然在普通的Java中没有办法隐式调用.鉴于我将围绕该代码发出大量警告,单一声明远离世界末日:)

如果你想验证它是否被调用,你可以A.f()在调用后立即检查A的构造函数中的结果- 这将检查调用是否已达到顶级.