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 파일과 디렉토리 작업 기술 요약
본고에서 기술한 것이 여러분의 자바 프로그램 설계에 도움이 되기를 바랍니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.