자바 내부 클래스 지식 집합

5557 단어 Java내부 류
자바 내부 클래스
의미
자바 프로 그래 밍 언어 에서 프로그램 은 클래스(class)로 구 축 된 것 입 니 다.한 가지 내부 에서 도 성명 류 를 할 수 있 는데 우 리 는 이런 종 류 를 내부 류 라 고 부른다.
역할
•더 좋 은 패 키 징 을 실현 하 였 습 니 다.일반 클래스(내부 클래스 가 아 닌)의 방문 장식 자 는 private 나 proctected 가 될 수 없고 내부 클래스 는 가능 하 다 는 것 을 알 고 있 습 니 다.내부 클래스 를 private 로 설명 할 때 외부 클래스 만 내부 클래스 에 접근 할 수 있 고 내부 클래스 를 잘 숨 깁 니 다.
•내부 클래스 는 외부 클래스 의 영향 을 받 지 않 고(extends)또는 구현(implements)의 다른 클래스 나 인 터 페 이 스 를 계승 할 수 있 습 니 다.
•내부 클래스 는 외부 클래스 의 필드 와 방법 을 직접 방문 할 수 있 으 며,private 로 수식 하 더 라 도 외부 클래스 는 내부 클래스 의 구성원 을 직접 방문 할 수 없습니다.
원리
내부 클래스 는 컴 파일 할 때의 개념 으로 컴 파일 한 후에 두 개의 독립 된 class 파일 을 생 성 합 니 다.다음 과 같 습 니 다.

  public class Outer{
    private String outerName = "outer";
    class Inner{
      private String innerName = "inner";
    }
  }

     컴 파일 된 파일 은 다음 과 같 습 니 다:
 
컴 파일 후 Outer.Inner 는 Outer$Inner 로 이름 이 바 뀌 었 고 문장(.)은 달러 기호($)로 바 뀌 었 습 니 다.
분류
자바 내부 클래스 는 구성원 내부 클래스,국부 내부 클래스,익명 내부 클래스,정적 내부 클래스 로 나 눌 수 있다.
1)구성원 내부 클래스
구성원 내부 클래스 는 외부 클래스 의 한 구성원 으로 볼 수 있 으 며,구성원 내부 클래스 에 서 는 정적 구성원 을 설명 할 수 없 지만,static final 필드 는 예외 입 니 다.로 딩 클래스 를 알 때 정적 구성원 을 초기 화 합 니 다.만약 에 구성원 내부 클래스 에 정적 구성원 이 있 으 면 내부 클래스 는 외부 클래스 전에 생 성 되 고 내부 클래스 는 외부 클래스 를 위 한 서비스 이 며 내부 클래스 는 외부 클래스 전에 생 성 되 어 통제 에서 벗 어 날 수 있 습 니 다.구성원 내부 클래스 를 예화 할 때 구성원 내부 클래스 는 외부 클래스 의 현재 대상 에 대한 인용 을 가지 고 있 습 니 다.그러면 구성원 내부 클래스 에서 외부 클래스 의 구성원 을 직접 방문 할 수 있 습 니 다.설령 private 가 수식 하 더 라 도.

    import static java.lang.System.out;
    public class Outer{
    private String outerName = "outer";
    //               ,          
    private Inner inner = new Inner(); 
    public class Inner{
       private String innerName = "inner";
      public void show(){
        out.println(outerName); //            
      }
    }
    public void show(){
       out.println(inner.innerName);
      inner.show();
    }
    public static void main(String[] args){
       Outer outer = new Outer();
      outer.show();
      //      
      Outer.Inner inner = outer.new Inner();
      inner.show();
    }
  }

실행 결과:
    inner
    outer
    outer
    구성원 내부 클래스 대외 클래스 대상 의 인용 은 this 앞 에 외부 클래스 의 이름 을 붙 여 구성 한 것 으로 이런 형식 을'
한정-tis,out.println(outerName)과 out.println(Outer.this.outerName)은 등가 입 니 다.
 2)  부분 내부 류
국부 내부 류 의 사용 은 구성원 내부 류 의 사용 과 기본적으로 일치 하지만 국부 내부 류 가 외부 류 에 정의 되 는 방법 에서 국부 변수 처럼 외부 류 의 구성원 이 아니다.부분 내부 클래스 는 방법 외 에 접근 할 수 없 지만 인 스 턴 스 는 방법 에서 되 돌아 갈 수 있 으 며 인 스 턴 스 는 더 이상 인용 되 지 않 기 전에 계속 존재 합 니 다.국부 내부 클래스 도 소재 방법의 국부 변수,방법 매개 변수 등에 접근 할 수 있 으 며 국부 변수 나 방법 매개 변 수 는 final 로 설 명 될 때 만 접근 할 수 있 습 니 다.  

  import static java.lang.System.out;
  public class Outer{
    private String outerName = "outer";
    public void show(final String str){  //     final  
      class Inner{
        public void print(){
          out.println(outerName+str);
        }
      }
      Inner inner = new Inner();
      inner.print();
    }
    public static void main(String[] args){
      Outer outer = new Outer();
      outer.show(":lalala");
    }
  }

실행 결과:
      outer:lalala
3)  익명 내부 클래스
익명 내부 류 를 유형 명 이 없 는 부분 내부 류 라 고 상상 할 수 있 고 익명 내부 류 는 다음 과 같은 특징 이 있다.
1.익명 내부 류 는 구조 기 가 있어 서 는 안 되 고 익명 내부 류 는 유형 명 이 없 으 면 구조 기 를 설명 할 수 없습니다.
2.익명 내부 클래스 는 하나의 인 터 페 이 스 를 계승 하거나 실현 해 야 합 니 다.new 의 유형 은 익명 류 의 초 유형 으로 지정 해 야 합 니 다.익명 류 는 표시 되 는 extends 나 implements 자구 가 있어 서 는 안 되 고 수정자 가 있어 서 는 안 됩 니 다.
3.익명 내부 클래스 는 구성원 내부 클래스,국부 내부 클래스 와 마찬가지 로 정적 구성원 을 설명 할 수 없습니다.   

  import static java.lang.System.out;
  public class Outer{
     private String outerName = "outer";
     public void show(final String str){
        new Inner(){  //   Inner  
           public void print(){
              out.println(outerName+str);
           }
        }.print();
     }
     public static void main(String[] args){
         Outer outer = new Outer();
         outer.show(":lalala");
      }
  }
  interface Inner{
      void print();
  }

실행 결과:
      outer:lalala
4)정적 내부 클래스
정적 내부 클래스,어떤 책 에 서 는 내장 클래스 라 고도 부 릅 니 다.설명 할 때 static 수정자 가 필요 합 니 다.정적 내부 클래스 는 앞의 세 가지 내부 클래스 와 다 르 고 정적 내부 클래스 는 외부 클래스 의 현재 대상 에 대한 인용 을 가지 지 않 기 때문에 정적 내부 클래스 에서 외부 클래스 의 비정 상 구성원 에 접근 할 수 없습니다.이렇게 말 하면 정적 내부 클래스 는 외부 클래스 에 의존 하지 않 습 니 다. 

  import static java.lang.System.out;
  public class Outer{
    private String outerName = "outer";
    private static int id = 123;
    private Inner inner = new Inner();
    public static class Inner{
      public void print1(){
        //out.println(outerName);              
        out.println(id);
      }
      public static void print2(){
        out.println(id);
      }
    }
    public void show(){
      inner.print1();
    }
    public static void main(String[] args){
      Outer outer = new Outer();
      outer.show();
      Outer.Inner.print2(); //             
    }
  }

좋은 웹페이지 즐겨찾기