问题描述
|
在“ Java in a Nutshell”一书的第3章第3.5节“子类和继承”中,有一段有关使用super来访问重写方法的段落:
请注意,super关键字调用方法的最直接覆盖版本。假设类A有一个子类B,它又有一个子类C,并且所有这三个类都定义了相同的方法f()。方法C.f()可以使用super.f()调用直接覆盖的方法B.f()。但是C.f()无法直接调用A.f():super.super.f()不是合法的Java语法。当然,如果C.f()调用B.f(),则可以合理地假设B.f()也可以调用A.f()。在使用覆盖方法时,这种链接相对常见:这是一种在不完全替换方法的情况下增强方法行为的方式。我们在本章前面显示的示例finalize()方法中看到了该技术:该方法调用super.finalize()来运行其超类finalization方法。
这是什么意思?类C的实例无法调用类A的f()吗?为什么?
解决方法
它将破坏封装。假设
B.f()
施加了一些约束-C.f()
应该不能通过直接调用A.f()
来解决这个问题。相反,它必须经过B.f()
。
, 但是C.f()无法
调用A.f()
是的,绝对正确。您只能调用立即超类方法。
查看有关super()的Sun教程