Java,隐式调用重写方法

标签 java inheritance oop

现在在一些 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();
 }
}

我想要调用 f(),然后向上迭代每个父类,运行重写的 f()。我通过显式调用 super.f() 来做到这一点,尽管我不想这样做。

我这样做的原因是在到达 A 中的构造函数之后必须进行后处理。每个类中都有可以正确初始化的状态,这就是为什么我们有 f() 的向上跟踪。

所以A的构造函数确实是

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

如果我执行类似 new C(); 的操作,我希望调用 C.f(),然后调用 B.f(),然后调用 A.f() 调用

无论如何,如果有更聪明的方法来做到这一点,我愿意接受。

最佳答案

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

尽管在普通 Java 中,无法隐式调用 super.f()。考虑到我会在该代码周围放置大量警告,单个语句远非世界末日:)

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

关于Java,隐式调用重写方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1511822/

相关文章:

java - 在扫雷游戏中查找空单元格时出现递归 stackOverflowError

java - 运行maven spi项目进行调试

子类中空重写方法的 Java 替代方案

PHP - 重新定义方法并调用相同方法的祖先版本

java - 图像不显示..Java

Java+DOM : Registering and using modification listeners: tutorials?

java - 在传递给 JFrame 的 java 控件上显示滚动条?

unit-testing - 类方法应该接受参数还是使用类属性

c++ - 有没有办法在继承类的基类中指定数组的大小?

php - 为什么在 PHP 中使用 "use"关键字来导入核心标识符?