覆盖Java中的私有final方法

时间:2012-03-04 06:56:11

标签: java

class X1
{
    private final void show() { ... }
}

class X2 extends X1
{
    private final void show() { ... }
}

问题1

代码正在编译而没有任何错误。由于final关键字阻止了方法被覆盖,为什么代码会编译?

问题2

如果我从private两种方法中删除show关键字,则代码无法按预期编译。为什么呢?

2 个答案:

答案 0 :(得分:11)

在X2中,方法不是同一种方法,它在X1中隐藏了方法。由于X1中的方法是私有的,因此X2不知道它,因此能够重用方法签名。所以,当你有一个X2对象而你调用show时,它将使用X2的节目。如果你有一个X1对象,它将使用X1的节目。

如果您在X2上使用@Override注释,它会发出警告,表示要覆盖的方法不存在(或错误,不是100%肯定)。

使用相同的方法签名显然不是一个好主意,因为稍后查看它的人可能会非常困惑,而且肯定无法明确表达您的意图。

答案 1 :(得分:1)

由于它们是私有函数,因此每个函数都属于自己的类。 show中的X2方法并未覆盖X1作为其private。 X2不知道X1中的show方法。但是当你删除私有分类器时,X2会意识到并编译抱怨。

相关问题