Java 关于关键字super的问题
在《Java简而言之》一书第3章第3.5节子类和继承中,有这样一段关于使用super访问重写方法的内容: 请注意,super关键字调用方法的最直接重写版本。假设类A有一个子类B,子类B有一个子类C,并且所有三个类都定义了相同的方法f()。方法C.f()可以调用方法B.f(),它使用super.f()直接覆盖该方法。但是C.f()无法直接调用A.f():super.super.f()不是合法的Java语法。当然,如果C.f()调用B.f(),那么可以合理地假设B.f()也可以调用A.f()。使用重写方法时,这种链接比较常见:它是一种在不完全替换方法的情况下增强方法行为的方法。我们在本章前面所示的finalize()方法示例中看到了这种技术:该方法调用super.finalize()来运行其超类finalization方法Java 关于关键字super的问题,java,Java,在《Java简而言之》一书第3章第3.5节子类和继承中,有这样一段关于使用super访问重写方法的内容: 请注意,super关键字调用方法的最直接重写版本。假设类A有一个子类B,子类B有一个子类C,并且所有三个类都定义了相同的方法f()。方法C.f()可以调用方法B.f(),它使用super.f()直接覆盖该方法。但是C.f()无法直接调用A.f():super.super.f()不是合法的Java语法。当然,如果C.f()调用B.f(),那么可以合理地假设B.f()也可以调用A.f()。使用重
这是什么意思?类C的实例无法调用类a的f()?为什么?它会破坏封装。假设
B.f()。相反,它必须通过B.f()
但是C.f()没有办法
调用A.f()
是的,绝对正确。您只能调用立即超类方法
准确地看。如果你发现你想从C中调用A.f(),那么是时候看看你的设计了。C是-a B,所以它不应该试图绕过B回到a中更通用的功能。如果C想调用a.f(),我们如何实现它,以便我可以通过B.f()调用它?B.f()应该调用a.f(),C不应该关心它-它只关心它调用的是B.f()