这是SCJP 6书中的代码:
private final void flipper() {
System.out.println("Clidder");
}
}
public class Clidlet extends Clidder {
public final void flipper() {
System.out.println("Clidlet");
}
public static void main(String[] args) {
new Clidlet().flipper();
}
}
在这里,超类中的方法 private final void flipper() 是一个最终方法,我们知道它们不能被它们的子类覆盖,因为它是最终的 .
在 Clidlet 类中有一个同名的方法方法 public final void flipper() 区别在于这一个是公共的 . 所以我的问题是这个访问说明符如何涉及覆盖在这里?因为这个超类方法是私有的,我们可以在具有相同名称,相同参数,相同返回类型但不能覆盖的子类上使用它吗?
2 回答
它没有超越方法 . 私有方法不是继承的,并且不能由子类访问或对子类可见 . 在方法上同时使用
private
和final
是相当愚蠢的 .您的
Clidlet
类实际上并未从Clidder
覆盖该方法,它只是定义了一个名为flipper()
的新方法,该方法与Clidder
中的方法无关 .这正是
@Override
关键字存在的原因 . 使用它,它会阻止你做出这样的细微错误,例如:以下代码无法编译,因为flipper()
实际上没有覆盖任何内容:这是他们放入那本书的一个非常糟糕的例子,除非它特别是没有访问基本私有方法的子类的例子 .
这不是一个实际的覆盖,子类只是声明一个碰巧具有相同名称的新方法;你只能这样做,因为父项中的方法是私有的,这意味着子类无法看到它,因此编译器不会混淆 .
我找到了更详细的答案here .