静的内部クラスと非静的内部クラスの違い

3043 ワード

Javaの内部クラスは、非静的内部クラス(匿名内部クラスも非静的内部クラス)と静的内部クラスに分けられ、両者と外部クラスの関係は異なり、作成方法も異なります.
1非静的内部クラスJavaの非静的内部クラスは、構築時に外部クラスの参照が伝達され、内部クラスの属性として機能するため、内部クラスは外部クラスの参照を暗黙的に保持する.すなわち,非静的内部クラスは構造時に外部クラスのインスタンスを伝達して構造する必要があり,通常のJavaクラスのように直接newで生成することはできない.簡単な例は次のとおりです.
1 import java.util.ArrayList;
 2 import java.util.LinkedList;
 3 import java.util.List;
 4 import java.util.Queue;
 5 import java.util.Scanner;
 6 
 7 public class Main {
 8 
 9     /**
10      * @param args
11      */
12     public  int k=3;
13     private static String string="Java";
14     protected float j=1.5f;
15     public static void show(){
16         System.out.println("show");
17     }
18     private void add(){
19         System.out.println("add");
20     }
21     public static void main(String[] args) {
22         // TODO Auto-generated method stub
23         Main m=new Main();
24         //              
25         Child c=m.new Child();
26         //Child c=new Child()           
27         c.test();
28  
29     }
30 //   Child
31   class Child{
32      public int i;
33      public void test(){
34          System.out.println("k=:"+k);
35          System.out.println("string:"+string);
36          add();
37          System.out.println("j=:"+j);
38          show();
39      }
40      
41  }
42 
43 }

また、非静的な内部クラスは、静的なメンバー変数とメソッドを含む外部クラスのすべてのメンバー変数とメソッドにアクセスでき、内部クラスChildのtest()メソッドを実行すると、次の結果が得られます.
1 k=:3
2 string:Java
3 add
4 j=:1.5
5 show

2静的内部クラスJavaの静的内部クラスは、構築時に外部クラスの参照を必要としないため、静的内部クラスは外部クラスの参照を持たず、静的内部クラスは外部クラスの静的メンバー変数と方法にしかアクセスできない.簡単な例は(上のコードを簡単に変更します):
public class Main {
 2 
 3     /**
 4      * @param args
 5      */
 6     public  int k=3;
 7     private static String string="Java";
 8     protected float j=1.5f;
 9     public static void show(){
10         System.out.println("show");
11     }
12     private void add(){
13         System.out.println("add");
14     }
15     public static void main(String[] args) {
16         // TODO Auto-generated method stub
17         Main m=new Main();
18         //Child c=m.new Childe();//  
19         Child c=new Child();
20         c.test();
21  
22     }
23   static class Child{
24      public int i;
25     
26      public void test(){
27 //         System.out.println("k=:"+k);//            
28          System.out.println("string:"+string);
29          //add(); //             
30 //         System.out.println("j=:"+j);
31          show();
32      }
33      
34  }
35 
36 }

上記のコードから,静的内部クラスの作成方式は通常のJavaクラスの作成方式と同様に,21行目のコードを実行すると以下の結果が得られる.
1 string:Java
2 show

3雑談Javaの非静的内部クラスのこの作成方式は、外部クラスの参照を暗黙的に保持し、デフォルトではこの参照は強い参照であるため、内部クラスのライフサイクルが外部クラスのライフサイクルより長い場合、プログラムはメモリの漏洩を起こしやすい(ゴミ回収器は外部クラスのインスタンスを回収すると思いますが、内部クラスが外部クラスの参照を持っているため、ゴミ回収器が正常に動作しない).このような状況を避けるために、内部クラスの内部に外部クラスのソフトリファレンス(または弱いリファレンス)を持っていることを示すことができます.構造方法によって伝達され、内部クラスの使用過程で、まず外部クラスが回収されたかどうかを判断する.