我想知道将私有(private)方法也声明为 final 是否有意义,我认为这没有意义。但我想象有一个排他的情况,并写了代码来解决它:
public class Boom {
private void touchMe() {
System.out.println("super::I am not overridable!");
}
private class Inner extends Boom {
private void touchMe() {
super.touchMe();
System.out.println("sub::You suck! I overrided you!");
}
}
public static void main(String... args) {
Boom boom = new Boom();
Boom.Inner inner = boom.new Inner();
inner.touchMe();
}
}
它编译并工作。 “我应该让 touchMe() 成为最终版”,我想并做到了:
public class Boom {
private final void touchMe() {
System.out.println("super::I am not overridable!");
}
private class Inner extends Boom {
private void touchMe() {
super.touchMe();
System.out.println("sub::You suck! I overrided you!");
}
}
public static void main(String... args) {
Boom boom = new Boom();
Boom.Inner inner = boom.new Inner();
inner.touchMe();
}
}
它也有效并告诉我
chicout@chicout-linlap:~$ java Boom
super::I am not overridable!
sub::You suck! I overrided you!
为什么?
最佳答案
私有(private)方法不能被覆盖(私有(private)方法是不能被继承的!)其实私有(private)方法声明不final没有区别。
您声明的两个方法,Boom.touchMe
和 Boom.Inner.touchMe
是两个完全独立的方法,它们恰好共享相同的标识符。 super.touchMe
指的是与 touchMe
不同的方法,这是因为 Boom.Inner.touchMe
shadows Boom.touchMe
(并不是因为它覆盖了它)。
这可以通过多种方式证明:
正如您自己发现的那样,如果您将方法更改为公开的,编译器会提示,因为您突然尝试覆盖 final方法。
如果您保持方法私有(private)并添加
@Override
注释,编译器会报错。正如 alpian 指出的,如果您将
Boom.Inner
对象转换为Boom
对象 (((Boom) inner).touchMe( )
)Boom.touchMe
被调用(如果它确实被覆盖了,那么强制转换无关紧要)。
相关问题:
关于java - 为什么内部类可以覆盖私有(private) final方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9524025/