Java 내부 클래스 원리와 용법 실례 총결산

5049 단어 Java내부 클래스
본고는 자바 내부 클래스의 원리와 용법을 실례로 서술하였다.다음과 같이 여러분에게 참고할 수 있도록 공유합니다.
1. 비정적 내부 클래스

public class OutClass {
  private String name = "outclass";
  public void show() {
    System.out.println(this.name);
  }
  public void innerShow() {
    InnerClass inner = new InnerClass();
    inner.show();
    inner.outShow();
  }
  //  
  class InnerClass {
    // 2.0 
    // public static int age=0;
    private String name = "innerclass";
    public void show() {
      System.out.println(this.name);
    }
    public void outShow() {
      // 3.0 , 
      System.out.println(OutClass.this.name);
    }
  }
  public static void main(String[] args) {
    OutClass out = new OutClass();
    out.show();
    out.innerShow();
    // 1.0 , this 
    //  this.InnerClass inner=new this.InnerClass();
    // InnerClass inner=new InnerClass();
  }
}

실행 결과:
outclass
innerclass
outclass
1. 외부 클래스는 비정적 내부 클래스에 직접 접근할 수 없으며, 외부 클래스에 내부 클래스의 인용 간접 접근을 저장해야 한다.
2. 비정적 내부 클래스에는 정적 속성이 있을 수 없습니다.
개인 이해: 비정적 내부 클래스는 외부 클래스의 실례 구성원으로 외부 클래스의 실례 대상이 가지고 있다. 만약에 내부 클래스에 정적 속성이 있다면 속성은 반드시 내부 클래스 소유, 즉 모든 내부 클래스 실례 대상이 이 속성을 공유해야 한다.그러나 이 내부류는 이미 외부류의 실례 대상에 속한다. 1:1의 관계인 것 같다. 외부류의 대상이 n개의 내부류 실례의 인용을 저장하지 않으면 내부류의 정적 속성이 존재할 필요가 있지만 이렇게 하면 아무런 의미가 없다.
3. 비정적 내부 클래스는 외부 클래스의 구성원을 마음대로 방문할 수 있다. 왜냐하면 그들은 모두 외부 클래스의 구성원이기 때문에 등급이 같다.
4. 내부 클래스의 실례를 얻으려면

OutClass.InnerClass inner=new OutClass().new InnerClass();
2. 정적 내부 클래스

public class OutClass {
  private String name = "outclass";
  private static int age = 10;
  //  
  static class InnerClass {
    public void show() {
      // 1.0
      System.out.println(new OutClass().name);
    }
    public void outShow() {
      // 2.0
      System.out.println(age);
    }
  }
  public static void main(String[] args) {
    // 3.0
    OutClass.InnerClass inner = new OutClass.InnerClass();
    inner.outShow();
    inner.show();
  }
}

실행 결과:

outclass
1. 정적 내부 클래스는 외부 클래스의 실례 구성원에 함부로 접근할 수 없으며 외부 클래스의 대상을 인용해야 한다.
2. 정적 내부 클래스는 외부 클래스의 클래스 구성원을 마음대로 접근할 수 있다.
3. 정적 내부 클래스의 실례를 얻으려면 형식은 다음과 같다.

OutClass.InnerClass inner=new OutClass.InnerClass();
비정적 내부 클래스와 인스턴스의 차이점에 유의하십시오.

OutClass.InnerClass inner=new OutClass().new InnerClass();
3. 국부류
1. 익명 내부 클래스

interface IDraw {
  void draw();
}
public class OutClass {
  public void createCircle(IDraw obj) {
    obj.draw();
  }
  public static void main(String[] args) {
    OutClass out = new OutClass();
    out.createCircle(new IDraw() {
      public void draw() {
        System.out.println("i'm drawing...");
      }
    });
  }
}

실행 결과:
i'm drawing...
다태적 형식의 방법createCircle(IDraw obj)을 호출할 때 매개 변수는 new IDraw(){ }를 사용했고 인터페이스로 보면 직접 실례화할 수 없다. 여기new IDraw()는 직접 실례화가 아니라 익명 내부 클래스를 만들었다.
2. 패키지 닫기와 리셋

interface IDraw {
  void draw();
}
public class OutClass {
  private String name = "private name";
  public Closure getClosure() {
    return new Closure();
  }
  class Closure implements IDraw {
    public void draw() {
      System.out.println(OutClass.this.name);// name
    }
  }
  public static void main(String[] args) {
    OutClass out = new OutClass();
    out.getClosure().draw();
  }
}

실행 결과:
private name
내부 클래스는 다른 클래스처럼 각종 인터페이스와 계승을 유연하게 실현할 수 있고 외부 클래스의 속성과 방법을 자신에게 귀속시켜 패키지를 형성할 수 있다.외부 클래스에서 외부 클래스의 인용을 얻을 수 있는 방법을 제공했다. 내부 클래스의 방법은 외부 클래스의 많은 정보, 심지어 개인 정보에 유연하게 접근했기 때문에 이 대상을 얻은 후에 외부 클래스의 방법과 함수를 반대로 호출하여 리셋을 형성할 수 있다.
사실 위에는 클러치의 형식만 있을 뿐 진정한 클러치가 아니다. 클러치의 정의에는 주로 귀속 방법의 변수가 있지만 자바는 방법의 내부 클래스를 실현할 수 없고 방법 변수에 접근할 수 있다. 왜냐하면 진정한 클러치를 실현할 수 없기 때문이다.
자바 내부 클래스는 많은 용도가 있다. 예를 들어 내부 클래스를 이용하여 여러 인터페이스를 실현하면 다중 계승을 모의할 수 있다.예를 들어 내부 클래스를 외부 클래스를 보조하는 도구 클래스로 만들어 외부 클래스가 더욱 좋은 논리와 확장을 실현하도록 돕는다.
더 많은 자바 관련 내용에 흥미를 가진 독자들은 본 사이트의 주제를 볼 수 있습니다: Java 대상 프로그램 설계 입문 및 진급 강좌, Java 데이터 구조 및 알고리즘 튜토리얼, Java 운영 DOM 노드 기술 요약Java 파일과 디렉토리 작업 기술 요약
본고에서 기술한 것이 여러분의 자바 프로그램 설계에 도움이 되기를 바랍니다.

좋은 웹페이지 즐겨찾기