2016-03-25 26 views
1

静的な内部クラスは、すべての静的なデータメンバーと外部クラスのメンバー関数にアクセスできることが観察されました。 javaはこれをどのようにしますか?アクセス修飾子がそれを防止しない限り静的内部クラスは、外部クラスのすべての静的データメンバーと静的メンバー関数にどのようにアクセスできますか?

class StaticClass{ 

    static int x=10; 

    static void show() { 
     System.out.println("show"); 
    } 

    public static void main(String[] args) { 
     InnerStatic i = new InnerStatic(); 
     i.display(); 
    } 

    static class InnerStatic { 

     static void display() { 
      System.out.println(x); 
      show(); 
     } 
    } 
} 
+0

内部クラスなので、非静的な内部クラスは、その外部クラスのすべてのインスタンスメンバーにアクセスできます。 –

答えて

1

Javaの静的メンバーは、クラスごとに1つずつ割り当てられます。静的メンバーにはクラスごとに1つの項目しかないので、Javaはそれぞれが実行時にどこにあるのかを知っています。

したがって、ここでの唯一の問題は、アクセス制御の観点からアイテムの可視性になります。ここでも、Javaコンパイラは各静的な項目にアクセスできる場所を知っているので、Javaには問題はありません。

InnerStatic.displayは、StaticClass.mainと同じ方法でStaticClass.showにアクセスできます。実際には、StaticClassと同じパッケージ内の任意の方法がこれを行うには許可されている:

StaticClass.show(); // this will compile from anywhere 

InnerStaticの利点は、コンパイラが、「周囲」クラスを知っているということなので、それがInnerStatic.showが見つからないときには、探し続けてStaticClassのメソッドを見つけます。

0

static方法はstaticフィールドと他のクラスのメソッドにアクセスすることができます。

これらは、メソッドとフィールドが同じクラスでアクセスされるのと同じ方法でアクセスされます。

0

あなたの例では、inner/outerはそれとは関係ありません。フィールドとメソッドはすべてpublicかpackage-private(可視性修飾子はありません)のいずれかであり、同じパッケージ内のどのクラスからもアクセス可能です。

関連する問題