我在2009年9月28日提交了以下错误.遗憾的是,我仍然没有得到任何回复,规范的最终版本仍然不正确.这真的是个bug吗?如果没有,为什么不呢?如果是,我该怎么办?
根据5.4.5 m1可以覆盖m2,即使m1是私有的.如果手动创建.class文件或组合两个编译中的.class,则会发生这种情况.
在我的例子中,我有A和B类,B扩展A.我编译这些类,使A包含一个名为f的公共方法,B包含一个私有方法,也称为f(首先声明两个方法public,compiling,copy A.类到安全的地方,删除A中的f声明并在B中更改为private,然后编译B并使用保存的A.class版本).
现在运行它时,我当前的Oracle JVM输出A(意味着调用A中的方法f).根据规范,B应该是输出(意味着应该调用B中的方法f).
编辑:实际上,B.f应该得到解决.如果调用者不是B,则由于对已解析方法的访问权限检查,调用可能会失败.但是,我认为方法解决部分是错误的.
我认为5.4.5中的定义应该检查m1的访问权限,而不仅仅是m2.
public class A {
public void f();
Code:
0: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #3 // String A
5: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
8: return
}
public class B extends A {
private void f();
Code:
0: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #3 // String B
5: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
8: return
}
谢谢,
卡斯滕