【发布时间】:2012-03-20 09:48:55
【问题描述】:
我想知道将私有方法也声明为 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!
为什么?
【问题讨论】:
-
这是“隐藏”或“隐藏”之类的。有点说明为什么扩展外部类有点邪恶(即使在枚举中,真的)。 / 试试
Boom inner = boom.new Inner(); -
为什么应该使用@Override 注释的好例子。确保您实际上覆盖了该方法
-
不应该写
super...两次吗? 更新不,过失。我明白了。 -
这里给出的解释有待改进。他们中的大多数声明内部类的方法是与包含类中的方法“分离的方法”,只是碰巧共享相同的名称。 (相同的 signature,我可能会添加。)但是,覆盖方法也是一个单独的方法,只是碰巧具有相同的名称。覆盖的魔力不是某种潜在的“相同性”,而是调度机制的行为。
-
这个
super.touchMe();...
标签: java overriding inner-classes final