【发布时间】:2011-10-15 08:49:14
【问题描述】:
这是我的代码
package alpha ;
class A1
{
static class A11
{
private
final // WHAT IS THE EFFECT OF THIS MODIFIER?
void fun ( String caller )
{
System . out . println ( "A11:\t" + caller ) ;
}
}
static class A12 extends A11
{
private void fun ( String caller )
{
super . fun ( caller + caller ) ;
}
}
public static void main ( String [ ] args )
{
A12 a12 = new A12 ( ) ;
a12 . fun ( "Hello" ) ;
}
}
我发现无论有没有 A1.A11 中的最终 mdifer,程序都能编译并运行。
我可以理解,如果没有 final 修饰符,A1.A12 可以看到并因此覆盖 fun 方法。它是私有的,但它们属于同一类,因此不存在可见性问题。
我不明白为什么它与 final 修饰符一起工作。不应该禁止 A1.A12 中的覆盖吗?
这是带有最终修饰符的程序的输出
java alpha/A1
A11: HelloHello
如果只是忽略其他有趣的方法,那么
- 编译器不会抱怨超级引用
- A11 不会在输出中
【问题讨论】:
-
你确定吗?也许你的编译器表现得很奇怪。
final使变量不可修改并防止子类化。不确定它如何影响方法。 -
@Ryan 它可以防止覆盖。
-
@Etienne 好的,这就是我的想法……但是 OP 很奇怪。您使用的是哪个 IDE 和哪个 JDK?
-
@Ryan 我没有使用 IDE。我正在使用 javac 1.6.0_20
标签: java private final modifiers