Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/98.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中重写私有final方法_Java - Fatal编程技术网

在Java中重写私有final方法

在Java中重写私有final方法,java,Java,问题1 代码正在编译,没有任何错误。既然final关键字可以防止方法被重写,为什么代码要编译 问题2 如果我从两个show方法中删除private关键字,则代码不会按预期编译。为什么?在X2中,该方法与X1中的方法不同,它将X1中的方法隐藏起来。因为X1中的方法是私有的,所以X2没有意识到它,因此能够重用方法签名。所以,当您有一个X2对象并调用show时,它将使用X2的show。当您有一个X1对象时,它将使用X1的显示 如果您在X2上使用@Override注释,它将发出警告,指出要重写的方法不存

问题1

代码正在编译,没有任何错误。既然
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() { ... }
}