关于关键字super的问题

时间:2011-05-23 09:24:56

标签: java

在“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()来运行它的超类终结方法。

这是什么意思? C类实例无法调用A类的f()?为什么呢?

2 个答案:

答案 0 :(得分:10)

它会破坏封装。假设B.f()强制执行某些约束 - C.f()不应该通过直接调用A.f()来解决这个问题。相反, 要通过B.f()

答案 1 :(得分:1)

  

但是C.f()没有办法   调用A.f()

是的,绝对正确。您只能调用立即超类方法。

查看Sun tutorial on super( )