자바 내부 클래스 익명 내부 클래스

6909 단어 android
내부 클래스:
1. 유형의 내부 에서 내부 류 는 일반 류 와 다 르 지 않다.
2. 내부 클래스 는 외부 클래스 의 구성원 을 방문 할 수 있 습 니 다.
3. 외부 클래스 대상 참조 생 성: 외부 클래스 이름. this
    다른 클래스 에 내부 클래스 인 스 턴 스 만 들 기: 외부 클래스 인 스 턴 스 이름. new + 내부 구조 함수
[java] view plain copy print ?
public class DotThis {  
  •     void f() { System.out.println("DotThis.f()"); }  

  •     public class Inner {  
  •         public DotThis outer() {  

  •             return DotThis. this; / / 외부 클래스 참조 생 성  
  •         }  

  •     }  
  •     public Inner inner() { return new Inner(); }  

  •     public static void main(String[] args) {  
  •         DotThis dt = new DotThis();  

  •         DotThis.Inner dti = dt.inner();  
  •         dti.outer().f();  

  •     }  
  • }  

  •   
  • public class DotNew {  

  •     public static void main(String[] args) {  
  •         DotThis dt = new DotThis();  

  •         DotThis.Inner dti = dt.new Inner (); / 다른 클래스 에서 내부 클래스 인 스 턴 스 를 만 듭 니 다.  
  •     }  

  • }  
    public class DotThis {
    	void f() { System.out.println("DotThis.f()"); }
    	public class Inner {
    		public DotThis outer() {
    			return DotThis.this;//         
    		}
    	}
    	public Inner inner() { return new Inner(); }
    	public static void main(String[] args) {
    		DotThis dt = new DotThis();
    		DotThis.Inner dti = dt.inner();
    		dti.outer().f();
    	}
    }
    
    public class DotNew {
    	public static void main(String[] args) {
    		DotThis dt = new DotThis();
    		DotThis.Inner dti = dt.new Inner();//            
    	}
    }

    4. 임의의 방법 이나 역할 영역 에서 내부 클래스 를 정의 할 수 있 습 니 다.
    익명 내부 클래스:
    1.   정의:
    [java] view plain copy print ?
    public class Parcel7 {  
  •     public Contents contents() {  

  •         return new Contents() {/ / 익명 내부 클래스 정의  
  •             private int i = 11;  

  •             public int value() { return i; }  
  •         };  

  •     }  
  •     public static void main(String[] args) {  

  •         Parcel7 p = new Parcel7();  
  •         Contents c = p.contents();  

  •         System.out.println(c.value());  
  •     }  

  • }  
    public class Parcel7 {
        public Contents contents() {
            return new Contents() {//       
                private int i = 11;
                public int value() { return i; }
            };
        }
        public static void main(String[] args) {
            Parcel7 p = new Parcel7();
            Contents c = p.contents();
            System.out.println(c.value());
        }
    }
    

    2. 익명 내부 클래스 의 계승:
    [java] view plain copy print ?
    abstract class Base { //기준 클래스  
  •     public Base(int i) {/ / 구조 함수, 추상 류 의 구조 함수 와 일반 류 의 구조 함수 기능 이 같 습 니 다.  

  •         System.out.println("Base constructor,i =" + i);  
  •     }  

  •     public abstract void f();  
  • }  

  • public class AnonymousConstructor {  
  •     public static Base getBase(int i) {  

  •         return new Base(i) {/ / 기본 구조 함수 호출  
  •             {System.out.println("Inside instance initializer ");} / / 클래스 의 정의 이기 때문에 블록 으로 표시 해 야 합 니 다. 그렇지 않 으 면 잘못 보고 합 니 다.  

  •             public void f() {  
  •                 System.out.println("In anonymous f()");  

  •             }  
  •         };  

  •     }  
  •     public static void main(String[] args) {  

  •         Base base = getBase(12);  
  •         base.f();  

  •     }  
  • }  
  • abstract class Base { //   
        public Base(int i) {//    ,                     
            System.out.println("Base constructor,i =" + i);
        }
        public abstract void f();
    }
    public class AnonymousConstructor {
        public static Base getBase(int i) {
            return new Base(i) {//         
                {System.out.println("Inside instance initializer");}//       ,      ,    
                public void f() {
                    System.out.println("In anonymous f()");
                }
            };
        }
        public static void main(String[] args) {
            Base base = getBase(12);
            base.f();
        }
    }

    출력:
    [java] view plain copy print ?
    Base constructor,i =12  //먼저 기본 구조 함수 호출  
  • Inside instance initializer  

  • In anonymous f()  
    Base constructor,i =12  //         
    Inside instance initializer
    In anonymous f()
    

    주: 익명 내부 클래스 에서 외부 정의 대상 을 사용 하여 매개 변 수 를 final 형식 으로 참조 하도록 요구 합 니 다. 다음 과 같 습 니 다.
    [java] view plain copy print ?
    public class Parcel10 {  
  •     public Destination destination(final String dest, final float price) {  

  •         return new Destination() {  
  •             private int cost;  

  •             {  
  •                 cost = Math.round(price);       //price 는 final  

  •                 if(cost > 100) {  
  •                     System.out.println("Over Budget!");  

  •                 }  
  •             }  

  •             private String label = dest;        //dest 파이 널  
  •             public String readLabel() { return label; }  

  •         };  
  •     }  

  •     public static void main(String[] args) {  
  •         Parcel10 p = new Parcel10();  

  •         Destination d = p.destination("Tasmania", 101.395F);  
  •     }  

  • }"COLOR: #993300">  
  •   
  • public class Parcel10 {
        public Destination destination(final String dest, final float price) {
            return new Destination() {
                private int cost;
                {
                    cost = Math.round(price);       //price final
                    if(cost > 100) {
                        System.out.println("Over Budget!");
                    }
                }
                private String label = dest;        //dest  final
                public String readLabel() { return label; }
            };
        }
        public static void main(String[] args) {
            Parcel10 p = new Parcel10();
            Destination d = p.destination("Tasmania", 101.395F);
        }
    }
    

    그렇지 않 으 면 오류 가 발생 합 니 다: 내부 클래스 에서 부분 변수 dest 에 접근 합 니 다. 최종 형식 으로 밝 혀 져 야 합 니 다.
    3. 익명 내부 클래스 의 제한: 하나의 인터페이스 나 계승 클래스 만 실현 할 수 있 습 니 다.
    끼 워 넣 기 클래스:
    1. 내부 클래스 는 static 로 수식 할 때 끼 워 넣 는 클래스 입 니 다.
    2. 끼 워 넣 기 클래스 를 만 들 려 면 외곽 대상 이 필요 없습니다.
    3. 포 함 된 클래스 에서 비 정적 외곽 대상 에 접근 할 수 없습니다.
    4. 일반 내부 클래스 는 static 데이터 와 필드 를 포함 할 수 없고, 끼 워 넣 는 클래스 도 있 을 수 없습니다. 그러나 끼 워 넣 는 클래스 는 이 모든 것 을 포함 할 수 있 습 니 다.
    마지막 으로 내부 류 의 역할 을 말 해 보 자.
    1. 다 중 상속 실현
    2. 반전 의 실현
    3. 프레임 제어...
    참고: thinking in java
    간단 한 것 을 베 꼈 는데 잘 이해 하지 못 하고 못 쓰 는 경우 가 많 습 니 다. 앞으로 더 깊이 볼 수 있 었 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기