内部クラスとクローズドパッケージ


内部クラスとクローズドパッケージ
今日、あるjavaグループでこのような内部クラスの問題が見られました.コードは以下の通りです.InnerDemo 01には内部クラスBarがあり、InnerDemo 01のmethodメソッドにはBarを継承するローカルサブクラスInnerClassがあります.InnerClassクラスではmethodメソッドで定義されたローカル変数が呼び出されます.
メソッド内のローカル変数は実行終了後に解放されることが一般的に知られていますが、内部クラスがこの変数にアクセスすると閉パッケージになります.
package com.wrh.innerdemo;

public class InnerDemo01 {
    class Bar{
        public void show(){
            //do ..
        }
    }
    public static void main(String[] args) {
        InnerDemo01 innerDemo01=new InnerDemo01();
        Bar bar=innerDemo01.method();
        bar.show();//   num    ????
    }
    public Bar  method(){
        //String str="wuranghao";
        int num=30;
        //              
        class innerClass extends Bar{

            public void show(){
                System.out.println(num);
            }
        }
        return new innerClass();
    }

}

実行結果:30
内部クラスは外部のローカル変数を使用し、実際には閉パケットを形成します.つまり、メソッド内の変数をキャプチャします.このキャプチャされた変数は、メソッドの実行が完了するにつれて消えることはできません.内部クラスのインスタンスがこの変数を使用する可能性があるためです.この変数を消さないようにfinalキーワードが必要です(final修飾の変数は定数になるので、メソッドの実行が完了するにつれて消えることはありません).内部クラスで外部メソッドの変数を使用した場合、final修飾を使用する必要があります.そうしないとコンパイルできませんが、JDK 8を使用している場合は、final修飾を追加しなくてもコンパイルできます.コンパイラが追加してくれたからです.
内部クラスのいくつかの知識点
1.静的でない内部クラスオブジェクトを作成する場合は、必ず外部クラスオブジェクトを作成してください.なぜなら、非静的内部クラスオブジェクトには、外部クラスオブジェクトへの参照があり、その外部クラス内のすべてのpublic protected privateの変数と方法を参照することができるからです.
2、内部クラスは静的であってもよく、すなわち内部クラスは静的内部クラスと非静的内部クラス(すなわち一般クラス)に分けられる.違いは、静的内部クラスに外部クラスへの参照がないことです.
3、非静的内部クラスには、静的属性、静的メソッド、またはもう一つの静的内部クラスが存在してはならない(内部クラスのネストは1層以上であってもよい).しかし、静的内部クラスは、静的属性、静的メソッド、または静的内部クラスというすべてを有することができる.
4、ローカル内部クラス、すなわちJavaの内部クラスはローカルであってもよく、1つのメソッドまたは1つのコードブロック内で定義することができる.
5、匿名内部クラスJavaの匿名内部クラスの文法規則は比較的簡単で、匿名配列のように、クラスのオブジェクトを作成するだけで、名前を使用する必要がない場合、匿名内部クラスの使用はコードをより簡潔に、より明確に見ることができます.
6、匿名の内部クラスは名前がないため、したがって、コンストラクション関数はありません(ただし、匿名の内部クラスがパラメータコンストラクション関数のみを含む親クラスを継承している場合は、作成時にこれらのパラメータを持参し、実装中にsuperキーを使用して対応するコンテンツを呼び出す必要があります).メンバー変数を初期化するには、次の方法があります.a)メソッドの匿名の内部クラスであれば、このメソッドを使用して目的のパラメータに渡すことができますが、これらのパラメータはfinalとして宣言する必要があります.b)匿名の内部クラスを名前のある局所内部クラスに改造し、構造関数を持つことができる.c)この匿名内部クラスで初期化コードブロックを使用する.
内部類のいくつかの例について説明すると、このブログを見ることができます.http://www.iteye.com/topic/442435