제10장: 내부류

2818 단어

정의


하나의 클래스의 정의를 다른 클래스의 정의 내부에 두면 내부 클래스이다.내부 클래스의 대상을 생성할 때 이 대상은 그 대상을 만드는 외곽 대상과 관련이 있다. 내부 클래스의 대상은 외곽 클래스의 인용을 비밀리에 포획하고 이 인용을 빌려 그 외곽 대상의 모든 구성원을 방문할 수 있다.하나의 내부 클래스가 얼마나 많이 끼워져 있는지는 중요하지 않으며, 끼워 넣을 수 있는 모든 외곽 클래스의 모든 구성원을 투명하게 방문할 수 있다.일반적인 내부 클래스는static 데이터와static 필드가 있을 수 없고, 플러그인 클래스도 포함할 수 없습니다.

형식.


OuterClassName.innerClassName: 외부 클래스의 내부 클래스 유형입니다.OuterClassName.this: 외부 클래스 대상에 대한 인용.외부 클래스 객체new: 다른 대상에서 내부 클래스의 대상을 만듭니다.(네스트된 클래스 - 정적 내부 클래스가 아닌 경우 외부 클래스 객체를 사용하여 내부 클래스 객체를 만들어야 합니다.)
public static void main(String[] args){
  OutNew on = new OutNew();
  OutNew.inner in = on.new Inner();
}

종류.


국부 내부 클래스: 방법, 역할 영역(if 역할 영역 내) 외부는 국부 내부 클래스에 접근할 수 없지만 반환 값은 인터페이스 유형의 내부 클래스 실례가 될 수 있다.방문 설명서가 있을 수 없습니다.익명 내부 클래스: 인터페이스나 기본 클래스의 익명 클래스 대상을 계승하고 new 표현식이 되돌아오는 인용은 자동으로 인터페이스나 기본 클래스에 대한 인용으로 바뀝니다.
public class Parce{
  // 
  public Wrapping warpping(){
    return new Wrapping(){
      public int value(){
        return super.value() * 47;
      }
    };
  }
  // 
  public Wrapping warpping(int x){
    return new Wrapping(x){
      public int value(){
        return super.value() * 47;
      }
    };
  }
  // 
  public Wrapping warpping(final int x){
    return new Wrapping(){
      public int value(){
        return super.value() * x;
      }
    };
  }
}

외부에서 정의된 대상을 익명으로 내부 클래스를 사용하려면 컴파일러는 인자 인용 형식final을 요구합니다.실례를 초기화하면 익명 내부 클래스에 구조기를 만드는 효과를 얻을 수 있습니다.
...
// i final, i , 
public static Base getBase(int i){
  return new Base(i){
    {print("Inside instance initializer");}
    public void f(){}
  }
}
...

익명류를 사용하여 공장 방법을 개조할 수 있다.플러그인 클래스: 내부 클래스 대상과 외부 클래스 대상 간의 관계를 원하지 않으면 내부 클래스를static로 설명할 수 있습니다.의미: 첫째, 플러그인 대상을 만들 때 외곽 클래스의 대상이 필요하지 않다. 둘째, 플러그인 클래스의 대상에서 비정상적인 외곽 클래스의 대상에 접근할 수 없다. 셋째,static 데이터와 필드가 있을 수 있다. 넷째, 플러그인 클래스는 인터페이스의 일부분으로 할 수 있고 인터페이스에 넣는 클래스는 자동적으로public와static로 이 인터페이스(예를 들어 인터페이스 테스트 코드)를 실현할 수 있다.

역할


내부 클래스와 상향 전환: 내부 클래스를 사용하여 하나의 인터페이스를 실현하고 클래스를private로 설정하면 구체적인 실현을 숨길 수 있습니다.모든 내부류는 하나의 (인터페이스의) 실현을 독립적으로 계승할 수 있기 때문에 외곽류가 이미 어떤 인터페이스의 실현을 계승했든 내부류에 영향을 주지 않는다.내부 클래스는 다중 계승의 해결 방안이 완전해지고 방안의 디자인에 충분한 유연성을 제공했다.클립: 클립은 호출 가능한 대상이며, 그 역할을 만드는 영역에서 나온 정보를 기록합니다.내부 클래스는 대상을 대상으로 하는 클로즈업이다.java는 내부 클래스를 사용하여 패키지 폐쇄, 리셋, 제어 프레임워크를 실현할 수 있습니다.

내부류의 계승


내부 클래스의 구조기는 외부 클래스 대상을 가리키는 인용에 연결되어야 하기 때문에 내부 클래스를 계승할 때 내보내기 클래스 구조기에 외부 클래스 대상을 전달하는 인용이 필요하다.
class WithInner{
  class Inner{}
}
public class InheritInner extends WithInner.Inner{
  InheritInner(WithInner wi){
    wi.super(); //must
  }
}

기류의 내부류는 이불류의 내부류로 덮이지 않고 각자 자신의 명칭 공간류에 있다.내부류에서 생겨난 것이다.class 파일 이름 규칙: 외곽 클래스의 이름 $내부 클래스의 이름입니다.class, 익명 클래스는 숫자를 표시로 합니다.

좋은 웹페이지 즐겨찾기