Javaの内部クラス学習

15482 ワード

1.匿名内部クラス
匿名クラスは名前を付けられないクラスなので、それらを引用することはできません.作成時にnew文の一部として宣言する必要があります.これは、new<クラスまたはインタフェース><クラスのマスター>という形式のnew文が、所与のクラスを拡張したり、所与のインタフェースを実現したりする新しい匿名クラスを宣言する別の形式のnew文を採用する必要があります.また、そのクラスの新しいインスタンスを作成し、文の結果として返します.拡張するクラスと実装するインタフェースはnew文のオペランドであり,匿名クラスの本体と続く.匿名クラスが別のクラスを拡張する場合、そのマスターはクラスのメンバーにアクセスしたり、上書きしたりすることができます.これは他の標準的なクラスと同じです.匿名クラスがインタフェースを実装している場合、そのボディはインタフェースを実装する方法を実装する必要があります.
 
匿名内部クラスの注意事項
匿名クラスの宣言はコンパイル時に行われ、実行時にインスタンス化されます.これは、forループのnew文が、いくつかの異なる匿名クラスのインスタンスを作成するのではなく、同じ匿名クラスのいくつかのインスタンスを作成することを意味します.
匿名内部クラスを使用する場合は、・匿名内部クラスに構造方法がないことを覚えておいてください.・匿名の内部クラスは、静的メンバー、メソッド、およびクラスを定義できません.・匿名内部クラスはpublic,protected,private,staticではいけない.・匿名内部クラスのインスタンスは1つしか作成できません.・匿名の内部クラスは、newの後ろにあり、インタフェースを暗黙的に実装したり、クラスを実装したりするに違いない.・匿名内部クラスはローカル内部クラスであるため、ローカル内部クラスのすべての制限が有効となる.
・内部クラスは、外部クラスの静的変数または静的メソッドにのみアクセスできます.
 
 1  
 2 interface NoNameClass {
 3 
 4 void print();
 5 
 6 }
 7 
 8 
 9 class NoInnerClass {
10 
11 
12 public NoNameClass show() {
13 
14 return new NoNameClass() {
15 
16  
17 @Override
18 
19 public void print() {
20 
21 System.out.println("hello world");
22 
23 }
24 
25 };
26 
27 }
28 
29 }
30 
31 
32 public class NoNameInnerClass {
33 
34 public static void main(String[] args) {
35 
36 NoInnerClass innerClass = new NoInnerClass();
37 
38 innerClass.show().print();
39 
40 }
41 
42 }

 
 
2.静的内部クラス(ネストクラス)(staticclassとして定義できるのは内部クラスのみ)
静的内部クラスは、外部クラスの静的変数と静的メソッドのみを呼び出すことができます.
静的内部クラスでは、静的または非静的のメンバーを定義できます.
 1 class InnerClass {
 2 
 3   private  static int a=7;
 4 
 5   public static void show()
 6 
 7   {
 8 
 9       System.out.println("show");
10 
11   }
12 
13  public static class staticInner{
14 
15 
16        public void info()
17 
18        {
19 
20            System.out.println(a);
21 
22            show();
23 
24        }
25 
26   }
27 
28 }
29 
30  
31 public class InnerClassTest
32 
33 {
34 
35     public static void main(String[] args) {
36 
37       InnerClass.staticInner innerClass=new InnerClass.staticInner();
38 
39        innerClass.info();
40 
41     }
42 
43 }

 
3.ローカル内部クラス
メンバー内部クラスは、外部クラスの静的および非静的変数およびメソッドを呼び出すことができます.
ただし、メンバー内部クラス内部ではstaticメソッドを定義できません.
 1 class LocalClass {
 2 
 3     private int a = 1;
 4 
 5     private static int b = 2;
 6 
 7     void info() {
 8 
 9        final int c = 4;
10 
11        class Inner {
12 
13            int a = 3;
14 
15  
16            void print() {
17 
18               System.out.println(a);//       
19 
20               System.out.println(LocalClass.this.a);//      
21 
22               System.out.println(b);//         
23 
24               System.out.println(c);//          final  
25 
26            }
27 
28        }
29 
30        new Inner().print();
31 
32     }
33 
34 }
35 
36 
37 public class LocalInnerClass {
38 
39     public static void main(String[] args) {
40 
41         newLocalClass().info();
42 
43     }
44 
45 }

 
4.メンバー内部クラス
メンバー内部クラスは、外部クラスの静的および非静的変数およびメソッドを呼び出すことができます.
ただし、メンバー内部クラス内部ではstaticメソッドを定義できません.
class MemberClass {

    private int a = 2;

    private static int b = 3;


    private static void show() {

       System.out.println("show");

    }

class InnerMember {

    private int a = 45;

    void info() {

           System.out.println(b);

           System.out.println(a);//    ,a                 a

           System.out.println(MemberClass.this.a);//              

           show();

 

       }

    }

}

 
public class MemberInnerClass {

   public static void main(String[] args) {

       MemberClass.InnerMember innerMember = new MemberClass().new InnerMember();//                        

//                      ,            ,   

new MemberClass().new InnerMember()        innerMember     

       innerMember.info();

    }

}