内部クラスと匿名クラス


内部クラスと匿名クラス


内部クラス


  • クラスに別のクラスが存在します

  • あまり使わない

  • 2つのクラスのメンバーへのアクセスが容易

  • しかし论理が复雑になり始めると、かえって葛藤の可能性が増す.
  • // outerclass
    
    package Inner;
    
    public class OuterClass {
    	int num = 10;
    	String str1 = "java";
    	static String str2 = "world";
    	
    	public OuterClass() {
    		System.out.println("this is OuterClass");
    	}
    	
    	
    	class InnerClass {
    		int num = 20;
    		// 이런식으로 바깥 클래스의 데이터를사용 가능
    		String str3 = str1;
    		
    		public InnerClass() {
    			System.out.println("this is InnerClass");
    		}
    		
    	}
    	
    	static class SInnerClass {
    		int num = 30;
    		// 이런식으로 바깥 클래스의 데이터를사용 가능
    		String str4 = str2;
    		
    		public SInnerClass() {
    			System.out.println("this is static InnerClass");
    		}
    		
    	}
    	
    }
    // main
    
    package Inner;
    
    public class MainClass {
    
    	public static void main(String[] args) {
    		
    		OuterClass oc = new OuterClass();
    		System.out.println("outer class num = " + oc.num);
    		System.out.println("outer class str1 = " + oc.str1);
    		System.out.println(" ---- ");
    		
    		// 도트노테이션으로 이너클래스에 접근
    		// 비정적 중첩 클래스는 바깥 클래스의 객체를 통해 객체를 만들어야함
    		// in은 oc에 대한 '숨은 외부 참조'를 갖게 됨
    		// 따라서 클래스 안에서 this. 를통해 바깥 클래스의 요소에 접근 가능
    		OuterClass.InnerClass in = oc.new InnerClass();
    		System.out.println("inner class num = " + in.num);
    		System.out.println("inner class num = " + in.str3);
    		System.out.println(" ---- ");
    		
    		// 정적 중첩 클래스는 바깥 클래스의 객체가 없어도 객체를 생성할 수 있음
    		// 정적 중첩 클래스는 외부 인스턴스 없이 생성 가능하므로 '외부 참조'가 존재하지 않음
    		// 따라서 클래스 안에서 this. 를 통해 바깥 클래스의 요소에 접근할 수 없다.
    		OuterClass.SInnerClass sin = new OuterClass.SInnerClass();
    		System.out.println("static inner class num = " + sin.num);
    		System.out.println("static inner class num = " + sin.str4);
    		System.out.println(" ---- ");
    		
    	}
    
    }
    
    /*
    결과
    this is OuterClass
    outer class num = 10
    outer class str1 = java
     ---- 
    this is InnerClass
    inner class num = 20
    inner class num = java
     ---- 
    this is static InnerClass
    static inner class num = 30
    static inner class num = world
     ---- 
    */
    外部参照の欠点から内部クラスを作成する場合は、できるだけ静的にする必要があります.
  • 外部参照の欠点
    インスタンスの作成時に
  • の参照値を入力する必要があるため、スペースパフォーマンスが
  • 低下する.
  • の外部インスタンスへの参照があるため、gcはインスタンスを取得できず、メモリ漏洩
  • を引き起こす可能性がある.

    匿名クラス

  • クラス、主に再定義(上書き)メソッドに使用
  • 匿名クラスは、主にインタフェースまたは抽象クラス
  • に使用される.
    // ananymousclass
    
    package Inner;
    
    public class AnonymousClass {
    	
    	public AnonymousClass() {
    		System.out.println("this is anonymousclass");
    	}
    	
    	public void method() {
    		System.out.println("this is anonymousclass's original method");
    	}
    }
    // main
    
    package Inner;
    
    public class MainClass {
    
    	public static void main(String[] args) {
    		
    		// 익명클래스
    		// 이름이 없다. 따라서 한번만 사용하고 버려짐
    		new AnonymousClass() {
    			
    			@Override
    			public void method() {
    				System.out.println("this is override");
    			};
    		}.method();
    		// 재정의한 메서드를 바로 사용
    		
    	}
    
    }
    
    /*
    결과
    this is anonymousclass
    this is override
    */
    // 오버라이드한 결과가 출력됨을 알 수 있다.