2016-06-17 42 views
5
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(); 
    } 
} 

结果是什么?对于这个问题,我期待答案“编译失败”,因为final方法不能被覆盖,也不允许继承。但答案是“Cliddet”,为什么呢?我是否误解了这个概念中的某些东西?这怎么可能是输出?请解释。确切的方法如何在java中使用最终方法

+0

有趣的边缘情况。经验法则:只是不这样做:) – dimo414

+0

如果你真的想检查最后删除'私人'关键字 – emotionlessbananas

回答

4

私有修饰符指示无法从子类Clidlet中看到Clidder类中的flipper()的方法。所以它不是重写,而只是在子类中看起来像一个新的方法声明。私人方法/字段不能被覆盖,因为它不能被看到。

+0

唷!我被骗了。谢谢你解释。 – vidya

1

private方法没有被覆盖,所以这里没有覆盖,所以没有违反final。实际上final上的private方法是无意义的,或者是多余的,请选择。

0

答案应该是“Cliddet”,因为您的最终方法有private访问修饰符,这使得它对于子类不可见。 Clidlet类中的鳍状肢方法有效地在父类中隐藏了相同的方法。这是非常危险的,因为这取决于它是从超类还是子类调用。

Clidlet clidlet = new Clidlet(); 
clidlet.flipper(); // prints Clidlet 

Clidder clidder = new Clidlet(); 
clidder.flipper(); // prints Clidder 
0

在这种情况下,private关键字可防止子类访问该方法。因此Clidlet询问Clidder有关方法属性,接收响应“我保持私人”,并执行它自己的方法。

这种情况说明了一个事实,即private之前(具有比较高的优先级)final,即private finalprivate ==并展示了混乱它可以导致。

+0

私人+最终用途少,但它是合法的?如果没有私人关键字,只有最终答案是编译失败,我说得对吗? – vidya