静态方法&继承 - 在编译时找不到java.lang.IllegalAccessError

时间:2016-04-17 12:53:48

标签: java inheritance static-methods

我有这样的文件结构和代码:

../内部/ A.java

package inside;
public class A{protected static void someStaticMethod(){}}

../内部/ B.java

package inside;
import inside.A;
public class B extends A{protected static void someStaticMethod(){}}

../内部/ 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.
}

}

与注释一致,编译时没有错误,但在运行时存在IllegalAccesError。

这种行为的真正原因是什么?

我找到了一个问题 - Why does Java bind variables at compile time? - 在第一个答案中可能会提到原因,但我肯定不确定。

2 个答案:

答案 0 :(得分:0)

抛出错误是因为您已将方法的可见性设置为protected,这意味着只能从子类或同一包中访问这些方法。

因此引发IllegalAccessError的原因是因为您的类Z不是来自C的子类,也不是Z与{C在同一个包中1}}。

Eclipse给了我一个编译器错误:

  

“线程中的异常”主“java.lang.Error:未解决的编译问题:       来自C类的doSomething()方法不可见“

答案 1 :(得分:0)

这可能是javac(Oracle Java编译器)中的错误 - 请参阅http://www.coderanch.com/t/664583/java/java/Static-methods-inheritance-java-lang