java Accessspecifier涉及重写子类中的?
这是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()是final方法,我们知道它们不能被它们的子类覆盖,因为它是final的
在Clidlet类中,有一个同名的方法public final void flipper()区别在于这个方法是public的。所以我的问题是这个访问说明符如何涉及这里的覆盖?因为这个超类方法是私有的,所以我们可以在具有相同名称、相同参数、相同返回类型但不作为重写的子类上使用它吗
# 1 楼答案
它没有覆盖该方法。私有方法不被继承,子类不能访问或对其可见。在一个方法上同时使用
private
和final
是相当愚蠢的您的
Clidlet
类实际上并没有从Clidder
重写该方法,它只是定义了一个名为flipper()
的新方法,该方法与Clidder
中的方法无关这正是
@Override
关键字存在的原因。使用它,它将防止您犯类似这样的细微错误,例如,以下代码将无法编译,因为flipper()
实际上并没有覆盖任何内容:对于他们来说,这是一个很糟糕的例子,除非它是一个子类无法访问基本私有方法的例子
# 2 楼答案
这不是一个实际的重写,子类只是声明一个新方法,该方法恰好具有相同的名称;您只能这样做,因为父类中的方法是私有的,这意味着子类无法看到它,因此编译器不会感到混淆
我找到了更详细的答案