这是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()区别在于这个是公共的。所以我的问题是这个访问说明符如何涉及覆盖在这里?因为这个超类方法是私有的,我们可以在具有相同名称,相同参数,相同返回类型但不能覆盖的子类上使用它吗?
答案 0 :(得分:1)
这不是重写方法。私有方法不是继承的,并且不能由子类访问或对子类可见。 1}}和private
同时使用方法非常愚蠢。
您的final
类实际上并未从Clidlet
覆盖该方法,它只是定义了一个名为Clidder
的新方法,该方法与flipper()
中的方法无关。
这正是Clidder
关键字存在的原因。使用它,它会阻止你做出这样的细微错误,例如:由于@Override
实际上没有覆盖任何内容,因此以下代码无法编译:
flipper()
这是他们放入那本书的一个非常糟糕的例子,除非它特别是没有访问基本私有方法的子类的例子。
答案 1 :(得分:0)
这不是实际的覆盖,子类只是声明一个碰巧具有相同名称的新方法;你只能这样做,因为父项中的方法是私有的,这意味着子类无法看到它,因此编译器不会混淆。
我找到了更详细的答案here。