最终方法在java中的确切方式

时间:2016-06-17 03:16:14

标签: java final

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"这是为什么?我是否误解了这个概念中的某些内容。这怎么可能是输出?请解释一下。

4 个答案:

答案 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关键字会阻止子类访问该方法。结果ClidletClidder询问方法属性,接收响应"我将其保密为私有"并执行它自己的方法。

这个案例说明了private先于{优先于finalprivate final == private的事实,并证明了它可能导致的混乱。