在Java中重写私有final方法
问题1 代码正在编译,没有任何错误。既然在Java中重写私有final方法,java,Java,问题1 代码正在编译,没有任何错误。既然final关键字可以防止方法被重写,为什么代码要编译 问题2 如果我从两个show方法中删除private关键字,则代码不会按预期编译。为什么?在X2中,该方法与X1中的方法不同,它将X1中的方法隐藏起来。因为X1中的方法是私有的,所以X2没有意识到它,因此能够重用方法签名。所以,当您有一个X2对象并调用show时,它将使用X2的show。当您有一个X1对象时,它将使用X1的显示 如果您在X2上使用@Override注释,它将发出警告,指出要重写的方法不存
final
关键字可以防止方法被重写,为什么代码要编译
问题2
如果我从两个
show
方法中删除private
关键字,则代码不会按预期编译。为什么?在X2中,该方法与X1中的方法不同,它将X1中的方法隐藏起来。因为X1中的方法是私有的,所以X2没有意识到它,因此能够重用方法签名。所以,当您有一个X2对象并调用show时,它将使用X2的show。当您有一个X1对象时,它将使用X1的显示
如果您在X2上使用@Override注释,它将发出警告,指出要重写的方法不存在(或错误,不是100%确定)
显然,使用相同的方法签名不是一个好主意,因为稍后查看该签名的人可能会感到非常困惑,并且它肯定不会明确您的意图。因为它们是私有函数,每个函数都属于自己的类。
X2
中的show
方法没有将X1
作为其私有
重写。X2不知道X1中的显示方法。但是,当您删除私有分类器时,X2会发现并编译投诉。请参阅此链接,这是一个同时具有final和private的好例子。由于它们是私有的,因此只能从X1
和X2
中的其他方法调用它们。对象的类型并不重要,重要的是调用它的上下文。X1
上调用X2
实例的show
的其他方法将调用X1.show
。你能解释一下阴影和过度填充之间的区别吗。@DavidHarkness是的,这一区别很重要。@prerna我不确定你还想让我说什么。重写意味着超类方法的功能被子类方法的功能所包含。因此,当使用X2时,无论在哪里使用show,都应该使用X2 show。阴影意味着子类方法只对调用show的X2方法有效,而X1 show只对调用show的X1方法有效。如果这看起来令人困惑,这应该告诉你为什么最好避免阴影,除非你有很好的理由。使用@Override注释将验证您是否覆盖了预期的内容,或者提醒您存在问题。
class X1
{
private final void show() { ... }
}
class X2 extends X1
{
private final void show() { ... }
}