2016-04-17 15 views
0

私はこのようなファイル構造やコードを持っている:静的メソッド&継承 - java.lang.IllegalAccessErrorコンパイル時に見つからない

../inside/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(){}} 

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

}コメントとラインで

コンパイル時にエラーがないが、実行時にIllegalAccesErrorがあります。

この動作の真の理由は何ですか?

私は質問を見つけました - Why does Java bind variables at compile time? - 最初の答えに多分理由が述べられているかもしれませんが、私は間違いなく確信しています。

+0

最後の行だけがエラーをスローしますか? –

+0

はい、最後の行だけがエラーをスローします。 –

+1

これはどのJavaバージョンですか? – fge

答えて

0

メソッドの可視性をprotectedに設定しているため、エラーがスローされます。これは、メソッドがサブクラスまたは同じパッケージからのみアクセスできることを意味します。

クラスZCからのサブクラスではありませんもCと同じパッケージでZあるので、そうIllegalAccessErrorがスローされた理由はあります。

Eclipseは私のコンパイラエラーを与える:

"Exception in thread "main" java.lang.Error: Unresolved compilation problem: The method doSomething() from the type C is not visible"

+0

私はこのエラーの原因を知っていますが、私が知りたいのは、エラーが見つからない理由とコンパイル時**ですcmdからjavacを使ってZ.javaをコンパイルする)。 –

+1

ああ、申し訳ありませんが、私はあなたの質問を勘違いしました。それから私はあなたを助けることができません。私の答えの日食で示されているように私は正確に同じコードで私はあなたのために働いていない理由を知らないcomplie時間エラーを与えます。 – Dimi

+0

NetBeansでは実行時までエラーがないので、かなり面白いです。 –

関連する問題