静态方法和继承 – java.lang.IllegalAccessError 未在编译时找到
Static methods & inheritance – java.lang.IllegalAccessError not found at compile-time
我有这样的文件结构和代码:
../inside/A.java
package inside;
public class A{protected static void someStaticMethod(){}}
../inside/B.java
package inside;
import inside.A;
public class B extends A{protected static void someStaticMethod(){}}
../inside/C.java
package inside;
import inside.B;
public class C extends B{protected static void someStaticMethod(){}}
../Z.java
import inside.*;
class Z extends B{
public static void main(String args[]){
A.someStaticMethod();
B.someStaticMethod();
C.someStaticMethod(); // Fine at compile-time but IllegalAccessError at run-time.
}
}
注释行在编译时没有错误,但在运行时有 IllegalAccessError。
这种行为的真正原因是什么?
我发现了一个问题 – – 在第一个答案中可能提到了原因,但我绝对不确定。
抛出错误是因为您将方法的可见性设置为 protected
,这意味着只能从子 class 或同一包中访问这些方法。
所以抛出 IllegalAccessError
的原因是因为你的 class Z
不是 C
的子 class 也不是 Z
与 C
.
在同一个包中
Eclipse 给我一个编译器错误:
"Exception in thread "main" java.lang.Error: Unresolved compilation problem:
The method doSomething() from the type C is not visible"
这可能是 javac 中的错误 – 参见 http://www.coderanch.com/t/664583/java/java/Static-methods-inheritance-java-lang。
我有这样的文件结构和代码:
../inside/A.java
package inside;
public class A{protected static void someStaticMethod(){}}
../inside/B.java
package inside;
import inside.A;
public class B extends A{protected static void someStaticMethod(){}}
../inside/C.java
package inside;
import inside.B;
public class C extends B{protected static void someStaticMethod(){}}
../Z.java
import inside.*;
class Z extends B{
public static void main(String args[]){
A.someStaticMethod();
B.someStaticMethod();
C.someStaticMethod(); // Fine at compile-time but IllegalAccessError at run-time.
}
}
注释行在编译时没有错误,但在运行时有 IllegalAccessError。
这种行为的真正原因是什么?
我发现了一个问题 –
抛出错误是因为您将方法的可见性设置为 protected
,这意味着只能从子 class 或同一包中访问这些方法。
所以抛出 IllegalAccessError
的原因是因为你的 class Z
不是 C
的子 class 也不是 Z
与 C
.
Eclipse 给我一个编译器错误:
"Exception in thread "main" java.lang.Error: Unresolved compilation problem: The method doSomething() from the type C is not visible"
这可能是 javac 中的错误 – 参见 http://www.coderanch.com/t/664583/java/java/Static-methods-inheritance-java-lang。