자바 내부 클래스 사용 총화

7103 단어 자바내부 류
1.내부 류 는 무엇 입 니까?
클래스 내부 에 정 의 된 클래스 를 내부 클래스 라 고 합 니 다.

 public class Out{
   class In{ //  In     
   } 
}
2.왜 내부 클래스 를 사용 합 니까?
1)패 키 징 을 강화 하고 내부 클래스 를 외부 클래스 에 숨 기 며 다른 클래스 가 내부 클래스 에 접근 하 는 것 을 허용 하지 않 습 니 다.
2)내부 클래스 는 코드 의 가 독성 과 유지보수 성 을 높 일 수 있다
3.내부 클래스 의 분류
내부 클래스 의 분 류 는 구성원 변수의 분류 와 비교 할 수 있다.
우 리 는 서로 다른 수정자 나 정 의 된 위치 에 따라 구성원 변 수 를 클래스 구성원 변수,인 스 턴 스 구성원 변수,부분 변수 로 세분 화 할 수 있 습 니 다.
내부 클래스 는 외부 클래스 의 한 구성원 으로 간주 되 며,내부 클래스 는 public/결 성/protected/private 수식 을 사용 할 수 있 습 니 다.static 수식 도 가능 합 니 다.
마찬가지 로 내부 클래스 도 서로 다른 수식 자 를 사용 하거나 정 의 된 위치 에 따라 4 가지 로 나 뉜 다.
1)인 스 턴 스 내부 클래스:내부 클래스 는 static 수식 을 사용 하지 않 았 습 니 다.
2)정적 내부 클래스:내부 클래스 는 static 수식 을 사용 합 니 다.
3)부분 내부 클래스:방법 에서 정 의 된 내부 클래스
4)익명 내부 클래스:한 번 만 사용 할 수 있 고 내부 클래스 에 속 하 는 특수 한 상황
3.1 인 스 턴 스 내부 클래스:
1)정의:인 스 턴 스 내부 클래스,즉 static 수식 을 사용 하지 않 은 내부 클래스 입 니 다.이 는 인 스 턴 스 내부 클래스 는 외부 클래스 의 대상 에 속 하고 외부 클래스 자체(유사 필드)에 속 하지 않 습 니 다.
2)인 스 턴 스 내부 클래스 만 들 기

//   
class Outter {
 //      :    static  
 class Inner {
 }
}
public class InnerDemo1 {
 public static void main(String[] args) {
 //        ,    static  ,        ,  ,        ,         
 Outter out = new Outter();
 //               
 Outter.Inner in = out.new Inner();
 }
}
3)특징:
a.인 스 턴 스 내부 클래스 를 만 드 는 과정 에서 알 수 있 듯 이 내부 클래스 대상 이 존재 할 때 반드시 외부 클래스 대상 이 존재 합 니 다.
b.인 스 턴 스 내부 클래스 의 인 스 턴 스 는 외부 클래스 의 인 스 턴 스 를 자동 으로 가지 고 있 습 니 다.인 스 턴 스 내부 클래스 는 외부 클래스 의 모든 필드 와 방법 을 무조건 방문 할 수 있 습 니 다.
메모:구성원 내부 클래스 가 외부 클래스 와 같은 이름 의 구성원 변수 나 방법 을 가지 고 있 을 때 숨겨 진 현상 이 발생 합 니 다.
c.외부 클래스 에서 내부 클래스 의 구성원 을 직접 방문 할 수 없습니다.먼저 구성원 내부 클래스 의 대상 을 만 든 다음 에 이 대상 을 가리 키 는 인용 을 통 해 방문 해 야 합 니 다.

//   
class Outter {
 private String name = "out";
 private Integer age = 17;
 //      :    static  
 class Inner {
 private Integer age = 18; //     ,       age
 Inner() {
  //   :1.               
  // 2.                     ,       
  System.out.println(name + this.age);//   out18
  //            age,  :   .this.age
  System.out.println(Outter.this.age);//   17
 }
 }
}
요약:쉽게 말 하면 변수의 역할 도 메 인 을 보면 외부 구성원 변수의 역할 도 메 인 은 전체 외부 유형 이 고 내부 류 는 외부 류 에서(외부 류 로 볼 수 있 는 필드)내부 류 는 자 연 스 럽 게 외부 류 를 방문 할 수 있다.한편,외부 류 는 내부 류 의 구성원 을 방문 해 야 한다.이렇게 이해 할 수 있다.내부 류 의 구성원 은 내부 류 에 속 하고 내부 류 에서 효과 적 이 며 내부 류 는 존재 하지 않 는 다.그 중의 구성원 변수 도 존재 하지 않 기 때문에 외부 클래스 에서 내부 클래스 의 구성원 을 직접 방문 할 수 없습니다.먼저 구성원 내부 클래스 의 대상 을 만 든 다음 에 이 대상 을 가리 키 는 인용 을 통 해 방문 해 야 합 니 다.
3.2 정적 내부 클래스
1)정의:static 로 장 식 된 내부 클래스 를 사용 합 니 다.따라서 이 내부 클래스 는 외부 클래스 자체 에 속 하지 외부 클래스 의 대상 에 속 하지 않 습 니 다.
2)정적 내부 클래스 만 들 기

//   
class Outter {
 //      :  static  
 static class Inner {
 }
}
public class InnerDemo2 {
 public static void main(String[] args) {
 //               ,              (    )
 Outter.Inner in = new Outter.Inner();
 }
}
3)특징:
a.내부 클래스 의 인 스 턴 스 를 만 들 때 외부 클래스 의 인 스 턴 스 를 만 들 필요 가 없습니다.
b.정적 내부 클래스 는 외부 클래스 의 정적 구성원 에 게 직접 접근 할 수 있 습 니 다.외부 클래스 의 인 스 턴 스 구성원 에 게 접근 하려 면 외부 클래스 의 인 스 턴 스 를 통 해 방문 해 야 합 니 다.
간단 한 이해:정적 구성원 은 클래스 에 속 하고 비정 상 구성원 은 대상 에 속 합 니 다.외부 클래스 의 인 스 턴 스 구성원(비정 상 구성원)을 방문 하려 면 외부 클래스 의 대상 을 저장 해 야 합 니 다.정적 내부 클래스 의 생 성 은 외부 클래스 의 대상 이 필요 하지 않 기 때문에 외부 클래스 의 인 스 턴 스 구성원 을 방문 하려 면 외부 클래스 의 인 스 턴 스 를 통 해 방문 해 야 합 니 다.
c.정적 내부 클래스 에서 정적 구성원 과 인 스 턴 스 구성원 을 정의 할 수 있 습 니 다.
d.테스트 클래스 는 완전한 클래스 이름 을 통 해 정적 내부 클래스 의 정적 구성원 을 직접 방문 할 수 있 습 니 다.

//   
class Outter {
 static String name = "outter";
 public Integer age = 17;
 //      :  static  
 static class Inner {
 Inner() {
  //                   
  System.out.println(name);//    outter
  //           ,             .
  System.out.println(new Outter().age);//    17
 }
 }
}
3.3 부분 내부 류(거의 사용 되 지 않 음)
1)정의:방법 에서 정 의 된 내부 클래스 의 가시 범 위 는 현재 방법 이 고 국부 변수 와 같은 단계 이기 때문에 국부 내부 클래스 는 방법 에서 만 사용 할 수 있다.
부분 내부 류 는 방법 안의 부분 변수 와 마찬가지 로 Public,proctected,private 와 static 수정자 가 있어 서 는 안 됩 니 다.

public class InnerDemo3 {
 public static void main(String[] args) {
 //      
 class Inner {
 }
 }
}
2)특징:
a.부분 내부 클래스 는 인 스 턴 스 내부 클래스 와 마찬가지 로 정적 구성원 을 포함 할 수 없습니다.(부분 내부 클래스 는 방법 에 속 하고 정적 구성원 은 클래스 에 속 합 니 다)
b.부분 내부 클래스 와 인 스 턴 스 내부 클래스 는 외부 클래스 의 모든 구성원 에 게 접근 할 수 있 습 니 다.
c.부분 내부 클래스 에 접근 하 는 부분 변 수 는 final 수식 을 사용 해 야 합 니 다.자바 8 에 서 는 자동 암시 적 으로 final(문법 사탕)을 추가 해 야 합 니 다.
원인:방법 이 호출 되 어 실 행 된 후에 현재 방법의 스 택 프레임 이 소각 되 고 방법 내부 의 부분 변수의 공간 이 모두 소각 되 었 습 니 다.그러나 내부 클래스 대상 은 메모리 에 있 을 수 있 습 니 다.인용 되 지 않 을 때 까지 소멸 할 수 있 습 니 다.이때 내부 클래스 는 존재 하지 않 는 부분 변 수 를 방문 해 야 합 니 다.이 문 제 를 피하 기 위해 저 희 는 final 로 부분 변 수 를 수식 합 니 다.따라서 상수 가 되 고 메모리 공간 에 영원히 존재 합 니 다.방법 이 없어 진 후에 도 이 부분 변 수 는 메모리 에 있 고 대상 은 계속 보유 할 수 있 습 니 다.

public class InnerDemo3 {
 public static void main(String[] args) {
 int age = 17;
 final int num = 15;
 //      
 class Inner {
  public void test() {
  //   :Cannot refer to a non-final variable age inside an inner class defined in a different method
  System.out.println(age);
  System.out.println(num);//   
  }
 }
 }
}
3.4 익명 내부 클래스(가장 자주 사용)
1):정의:익명 내부 클래스 는 이름 이 없 는 부분 내부 클래스 로 한 번 만 사용 하기에 적합 한 클래스 입 니 다.
2)익명 내부 클래스 만 들 기:
익명 내부 클래스 자 체 는 구조 기 가 없 지만 부모 구조 기 를 호출 합 니 다.일반적으로 익명 내부 클래스 는 다른 클래스 를 계승 하거나 인 터 페 이 스 를 실현 하 는 데 사용 되 며 추가 적 인 방법 을 추가 할 필요 가 없습니다.다만 계승 방법 에 대한 실현 이나 재 작성 일 뿐 입 니 다.
메모:익명 내부 클래스 는 하나의 부모 클래스 를 계승 하거나 하나의 인 터 페 이 스 를 실현 해 야 하지만,최대 하나의 부모 클래스 만 있 거나 하나의 인 터 페 이 스 를 실현 할 수 있 습 니 다.

//      
interface Person {
 public void eat();
}
public class AnonymousDemo {
 public static void main(String[] args) {
 //        
 Person p = new Person() {
  public void eat() {
  System.out.println("eat something");
  }
 };
 p.eat();
 }
}
4.총화

5.면접 문제

public class Outer {
 public void someOuterMethod() {
 // Line 3
 }
 public class Inner {
 }
 public static void main(String[] argv) {
 Outer o = new Outer();
 // Line 8
 }
}
/*
 * Which instantiates an instance of Inner?
A. new Inner(); // At line 3
B. new Inner(); // At line 8
C. new o.Inner(); // At line 8
D. new Outer.Inner(); // At line 8
 */
답 A.new Inner();this.new Inner()와 같 음;Outer 클래스 대상 이 이미 존재 합 니 다.
line 8 정확 한 표기 법 은 o.new Inner()여야 합 니 다.
이상 은 본 고의 모든 내용 입 니 다.본 고의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.또한 저 희 를 많이 지지 해 주시 기 바 랍 니 다!

좋은 웹페이지 즐겨찾기