제10장: 내부류
정의
하나의 클래스의 정의를 다른 클래스의 정의 내부에 두면 내부 클래스이다.내부 클래스의 대상을 생성할 때 이 대상은 그 대상을 만드는 외곽 대상과 관련이 있다. 내부 클래스의 대상은 외곽 클래스의 인용을 비밀리에 포획하고 이 인용을 빌려 그 외곽 대상의 모든 구성원을 방문할 수 있다.하나의 내부 클래스가 얼마나 많이 끼워져 있는지는 중요하지 않으며, 끼워 넣을 수 있는 모든 외곽 클래스의 모든 구성원을 투명하게 방문할 수 있다.일반적인 내부 클래스는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, 익명 클래스는 숫자를 표시로 합니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.