JAVAの4つの内部クラス-メンバー内部クラス、静的内部クラス、メソッド内部クラス、匿名内部クラス

5532 ワード

まとめてみると、JAVAクラスの4つの内部クラス
一.メンバー内部クラス
1.InnerクラスはOuterクラスの内部に定義され、Outerクラスのメンバー変数と同様に、Innerクラスには任意のアクセス制御子(public,protected,private)があります.
2.Innerクラスのメソッドは、Outerクラスのメンバーとメソッド(プライベートを含む)を直接使用できますが、OuterクラスはInnerクラスのメンバーとメソッドを直接使用できません.
3.Innerクラスを宣言するオブジェクトは、Outerクラスのオブジェクトを先に宣言する必要があります:Outer ot=new Outer()  Inner inr = ot.new Inner();
4.OuterクラスはInnerクラスと同じ名前のメンバーまたはメソッドを持ち、内部クラスはデフォルトで自分のメンバーとメソッドを返します.外部クラスのメンバーまたはメソッドを使用する場合は、thisを使用します. Outer.this.メンバーまたはメソッド名.
// OuterClass1    
public class OuterClass1 {
	private int count = 10;
	private int num = 30;

	private void printString() {
		System.out.println("   ");
	}

	private void printStr() {
		System.out.println("   2");
	}

	// InnerClass1      
	public class InnerClass1 {
		private int count = 20;

		private void printString() {
			//               
			System.out.println("      count :" + count);
			//            
			System.out.println("    count :" + OuterClass1.this.count);
			//            
			System.out.println("    num :" + num);
			//          
			printStr();
			//          printString()
			OuterClass1.this.printString();

		}

		

	}

	public static void main(String[] args) {
		OuterClass1 otc1 = new OuterClass1();
	

		InnerClass1 ic1 = otc1.new InnerClass1();
		
		ic1.printString();

	}
}
出力結果:
メンバー内部クラスのcount値:20
外部クラスのcount値:10
外部クラスnum値:30
外部クラス2
外部クラス
 
二.静的内部クラス
1.静的内部クラスが外部クラスの非静的メンバーに直接アクセスできない
2.外部クラスの静的メンバーが内部クラスの静的メンバーと重複する場合、外部クラス名.静的メンバーからアクセス可能
3.内部クラスインスタンスの作成:内部クラスオブジェクト名=new内部クラス()
public class OuterClass2{
        public static int num = 10;
        public int account = 100;

        public static class InnerClass2{
                public static int num = 20;
                public void print(){
                System.out.println("       num: " + OuterClass2.num);
                System.out.println("       num: " + num);
                System.out.println("        account: " + new OuterClass2().account);
                }

        }

        public static void main(String[] args){
                InnerClass2 inc2 = new InnerClass2();
                inc2.print();
        }

}
出力結果:
外部クラス静的メンバーnum:10
内部クラス静的メンバーnum:20
外部クラス非静的メンバーaccount:100
三.方法内部クラス
1.メソッド内部クラスとは、外部クラスに定義されたメソッドであり、メソッド内部クラスはそのメソッドでのみ表示されます(このメソッドでのみ使用できます).
2.メソッド内部クラスは外部クラスのメソッド以外では使用できませんので、メソッド内部クラスではアクセス制御子やstatic修飾子は使用できません
public class OuterClass3{
        int a = 40;
        public void show(){
                final int b = 50;
                int e = 60;
                class InnerClass3{
                        int c = 30;
                        public void print(){
                                System.out.println("       a: " + a);
                                //     ,            e
                                System.out.println("          b: " + b);
                                System.out.println("       c: " + c);
                        }

                }

                InnerClass3 inc = new InnerClass3();
                inc.print();

        }

        public static void main(String[] args){
                OuterClass3 otc = new OuterClass3();
                otc.show();
        }

メソッド内部クラスでは外部メソッドfinal定数しか使用できません:参照をコピーし、外部クラスのメソッドによって変更されるなど、参照値の変更を避けるために内部クラスで得られる値が一致しないため、finalを使用してその参照を変更できません.
四.匿名内部クラス
1.匿名内部クラスを使用する場合、クラスを継承するか、インタフェースを実装する必要があります.2.匿名内部クラスでは構造関数を定義できません.3.匿名内部クラスには静的メンバー変数と静的メソッドが存在しません.4.匿名内部クラスは局所内部クラスです.したがって、局所内部クラスのすべての制限は匿名内部クラスに対しても有効です.5.匿名内部クラスは抽象的ではありません.継承されたクラスまたはインプリメンテーションを実装する必要があるインタフェースのすべての抽象メソッドは、次のように定義されます.
new      (    )|     (){  
     //            
    }

例:value値に基づいてMapをソートする
public class SortValueMap {

	public static void main(String[] args) {
		Map<String, Double> map = new HashMap<String, Double>();
		map.put(" ", 280.0);
		map.put("  ", 1000.0);
		map.put("   ", 10000.0);
		
		System.out.println("  map: ");
		List<Map.Entry<String, Double>> list = new ArrayList<Map.Entry<String, Double>>(map.entrySet());
		for(Iterator<Map.Entry<String, Double>> ite = list.iterator(); ite.hasNext(); ){
			Map.Entry<String, Double> mery = ite.next();
			System.out.println(mery.getKey() + " -> " + mery.getValue());			
		}
		//      ,   Comparator  
		Collections.sort(list, new Comparator<Map.Entry<String, Double>>(){
			@Override
			public int compare(Entry<String, Double> o1,
					Entry<String, Double> o2) {
				// TODO Auto-generated method stub
				return o1.getValue().compareTo(o2.getValue());
			}
			
		});
		
		System.out.println("sort value map: ");
		for(Iterator<Map.Entry<String, Double>> ite = list.iterator(); ite.hasNext(); ){
			Map.Entry<String, Double> mery = ite.next();
			System.out.println(mery.getKey() + " -> " + mery.getValue());			
		}
		
	}

}