class Clidder {
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();
}
}
结果如何?对于这个问题,我期待答案"编译失败"因为最终方法不能被覆盖,并且它不允许继承。但答案是" Cliddet"这是为什么?我是否误解了这个概念中的某些内容。这怎么可能是输出?请解释一下。
答案 0 :(得分:4)
private修饰符表示无法从子类Clidlet中看到Clidder类中的flipper()方法。所以它不是覆盖,但只是看起来像子类中的新方法声明。私有方法/字段无法覆盖,因为无法看到。
答案 1 :(得分:1)
private
方法未被覆盖,因此此处没有覆盖,因此不会违反final
。事实上final
方法上的private
无意义或多余,请选择。
答案 2 :(得分:0)
答案应为“Cliddet”,因为您的最终方法具有private
访问修饰符,使其对子类不可见。 Clidlet
类中的鳍状肢方法有效地隐藏了父类中的相同方法。这是非常危险的,因为结果将取决于它是从超类还是从子类调用。
Clidlet clidlet = new Clidlet();
clidlet.flipper(); // prints Clidlet
Clidder clidder = new Clidlet();
clidder.flipper(); // prints Clidder
答案 3 :(得分:0)
在这种情况下,private
关键字会阻止子类访问该方法。结果Clidlet
向Clidder
询问方法属性,接收响应"我将其保密为私有"并执行它自己的方法。
这个案例说明了private
先于{优先于final
,private final
== private
的事实,并证明了它可能导致的混乱。