자바 내부 클래스 사용 총화
클래스 내부 에 정 의 된 클래스 를 내부 클래스 라 고 합 니 다.
public class Out{
class In{ // In
}
}
2.왜 내부 클래스 를 사용 합 니까?1)패 키 징 을 강화 하고 내부 클래스 를 외부 클래스 에 숨 기 며 다른 클래스 가 내부 클래스 에 접근 하 는 것 을 허용 하지 않 습 니 다.
2)내부 클래스 는 코드 의 가 독성 과 유지보수 성 을 높 일 수 있다
3.내부 클래스 의 분류
내부 클래스 의 분 류 는 구성원 변수의 분류 와 비교 할 수 있다.
우 리 는 서로 다른 수정자 나 정 의 된 위치 에 따라 구성원 변 수 를 클래스 구성원 변수,인 스 턴 스 구성원 변수,부분 변수 로 세분 화 할 수 있 습 니 다.
내부 클래스 는 외부 클래스 의 한 구성원 으로 간주 되 며,내부 클래스 는 public/결 성/protected/private 수식 을 사용 할 수 있 습 니 다.static 수식 도 가능 합 니 다.
마찬가지 로 내부 클래스 도 서로 다른 수식 자 를 사용 하거나 정 의 된 위치 에 따라 4 가지 로 나 뉜 다.
1)인 스 턴 스 내부 클래스:내부 클래스 는 static 수식 을 사용 하지 않 았 습 니 다.
2)정적 내부 클래스:내부 클래스 는 static 수식 을 사용 합 니 다.
3)부분 내부 클래스:방법 에서 정 의 된 내부 클래스
4)익명 내부 클래스:한 번 만 사용 할 수 있 고 내부 클래스 에 속 하 는 특수 한 상황
3.1 인 스 턴 스 내부 클래스:
1)정의:인 스 턴 스 내부 클래스,즉 static 수식 을 사용 하지 않 은 내부 클래스 입 니 다.이 는 인 스 턴 스 내부 클래스 는 외부 클래스 의 대상 에 속 하고 외부 클래스 자체(유사 필드)에 속 하지 않 습 니 다.
2)인 스 턴 스 내부 클래스 만 들 기
//
class Outter {
// : static
class Inner {
}
}
public class InnerDemo1 {
public static void main(String[] args) {
// , static , , , ,
Outter out = new Outter();
//
Outter.Inner in = out.new Inner();
}
}
3)특징:a.인 스 턴 스 내부 클래스 를 만 드 는 과정 에서 알 수 있 듯 이 내부 클래스 대상 이 존재 할 때 반드시 외부 클래스 대상 이 존재 합 니 다.
b.인 스 턴 스 내부 클래스 의 인 스 턴 스 는 외부 클래스 의 인 스 턴 스 를 자동 으로 가지 고 있 습 니 다.인 스 턴 스 내부 클래스 는 외부 클래스 의 모든 필드 와 방법 을 무조건 방문 할 수 있 습 니 다.
메모:구성원 내부 클래스 가 외부 클래스 와 같은 이름 의 구성원 변수 나 방법 을 가지 고 있 을 때 숨겨 진 현상 이 발생 합 니 다.
c.외부 클래스 에서 내부 클래스 의 구성원 을 직접 방문 할 수 없습니다.먼저 구성원 내부 클래스 의 대상 을 만 든 다음 에 이 대상 을 가리 키 는 인용 을 통 해 방문 해 야 합 니 다.
//
class Outter {
private String name = "out";
private Integer age = 17;
// : static
class Inner {
private Integer age = 18; // , age
Inner() {
// :1.
// 2. ,
System.out.println(name + this.age);// out18
// age, : .this.age
System.out.println(Outter.this.age);// 17
}
}
}
요약:쉽게 말 하면 변수의 역할 도 메 인 을 보면 외부 구성원 변수의 역할 도 메 인 은 전체 외부 유형 이 고 내부 류 는 외부 류 에서(외부 류 로 볼 수 있 는 필드)내부 류 는 자 연 스 럽 게 외부 류 를 방문 할 수 있다.한편,외부 류 는 내부 류 의 구성원 을 방문 해 야 한다.이렇게 이해 할 수 있다.내부 류 의 구성원 은 내부 류 에 속 하고 내부 류 에서 효과 적 이 며 내부 류 는 존재 하지 않 는 다.그 중의 구성원 변수 도 존재 하지 않 기 때문에 외부 클래스 에서 내부 클래스 의 구성원 을 직접 방문 할 수 없습니다.먼저 구성원 내부 클래스 의 대상 을 만 든 다음 에 이 대상 을 가리 키 는 인용 을 통 해 방문 해 야 합 니 다.3.2 정적 내부 클래스
1)정의:static 로 장 식 된 내부 클래스 를 사용 합 니 다.따라서 이 내부 클래스 는 외부 클래스 자체 에 속 하지 외부 클래스 의 대상 에 속 하지 않 습 니 다.
2)정적 내부 클래스 만 들 기
//
class Outter {
// : static
static class Inner {
}
}
public class InnerDemo2 {
public static void main(String[] args) {
// , ( )
Outter.Inner in = new Outter.Inner();
}
}
3)특징:a.내부 클래스 의 인 스 턴 스 를 만 들 때 외부 클래스 의 인 스 턴 스 를 만 들 필요 가 없습니다.
b.정적 내부 클래스 는 외부 클래스 의 정적 구성원 에 게 직접 접근 할 수 있 습 니 다.외부 클래스 의 인 스 턴 스 구성원 에 게 접근 하려 면 외부 클래스 의 인 스 턴 스 를 통 해 방문 해 야 합 니 다.
간단 한 이해:정적 구성원 은 클래스 에 속 하고 비정 상 구성원 은 대상 에 속 합 니 다.외부 클래스 의 인 스 턴 스 구성원(비정 상 구성원)을 방문 하려 면 외부 클래스 의 대상 을 저장 해 야 합 니 다.정적 내부 클래스 의 생 성 은 외부 클래스 의 대상 이 필요 하지 않 기 때문에 외부 클래스 의 인 스 턴 스 구성원 을 방문 하려 면 외부 클래스 의 인 스 턴 스 를 통 해 방문 해 야 합 니 다.
c.정적 내부 클래스 에서 정적 구성원 과 인 스 턴 스 구성원 을 정의 할 수 있 습 니 다.
d.테스트 클래스 는 완전한 클래스 이름 을 통 해 정적 내부 클래스 의 정적 구성원 을 직접 방문 할 수 있 습 니 다.
//
class Outter {
static String name = "outter";
public Integer age = 17;
// : static
static class Inner {
Inner() {
//
System.out.println(name);// outter
// , .
System.out.println(new Outter().age);// 17
}
}
}
3.3 부분 내부 류(거의 사용 되 지 않 음)1)정의:방법 에서 정 의 된 내부 클래스 의 가시 범 위 는 현재 방법 이 고 국부 변수 와 같은 단계 이기 때문에 국부 내부 클래스 는 방법 에서 만 사용 할 수 있다.
부분 내부 류 는 방법 안의 부분 변수 와 마찬가지 로 Public,proctected,private 와 static 수정자 가 있어 서 는 안 됩 니 다.
public class InnerDemo3 {
public static void main(String[] args) {
//
class Inner {
}
}
}
2)특징:a.부분 내부 클래스 는 인 스 턴 스 내부 클래스 와 마찬가지 로 정적 구성원 을 포함 할 수 없습니다.(부분 내부 클래스 는 방법 에 속 하고 정적 구성원 은 클래스 에 속 합 니 다)
b.부분 내부 클래스 와 인 스 턴 스 내부 클래스 는 외부 클래스 의 모든 구성원 에 게 접근 할 수 있 습 니 다.
c.부분 내부 클래스 에 접근 하 는 부분 변 수 는 final 수식 을 사용 해 야 합 니 다.자바 8 에 서 는 자동 암시 적 으로 final(문법 사탕)을 추가 해 야 합 니 다.
원인:방법 이 호출 되 어 실 행 된 후에 현재 방법의 스 택 프레임 이 소각 되 고 방법 내부 의 부분 변수의 공간 이 모두 소각 되 었 습 니 다.그러나 내부 클래스 대상 은 메모리 에 있 을 수 있 습 니 다.인용 되 지 않 을 때 까지 소멸 할 수 있 습 니 다.이때 내부 클래스 는 존재 하지 않 는 부분 변 수 를 방문 해 야 합 니 다.이 문 제 를 피하 기 위해 저 희 는 final 로 부분 변 수 를 수식 합 니 다.따라서 상수 가 되 고 메모리 공간 에 영원히 존재 합 니 다.방법 이 없어 진 후에 도 이 부분 변 수 는 메모리 에 있 고 대상 은 계속 보유 할 수 있 습 니 다.
public class InnerDemo3 {
public static void main(String[] args) {
int age = 17;
final int num = 15;
//
class Inner {
public void test() {
// :Cannot refer to a non-final variable age inside an inner class defined in a different method
System.out.println(age);
System.out.println(num);//
}
}
}
}
3.4 익명 내부 클래스(가장 자주 사용)1):정의:익명 내부 클래스 는 이름 이 없 는 부분 내부 클래스 로 한 번 만 사용 하기에 적합 한 클래스 입 니 다.
2)익명 내부 클래스 만 들 기:
익명 내부 클래스 자 체 는 구조 기 가 없 지만 부모 구조 기 를 호출 합 니 다.일반적으로 익명 내부 클래스 는 다른 클래스 를 계승 하거나 인 터 페 이 스 를 실현 하 는 데 사용 되 며 추가 적 인 방법 을 추가 할 필요 가 없습니다.다만 계승 방법 에 대한 실현 이나 재 작성 일 뿐 입 니 다.
메모:익명 내부 클래스 는 하나의 부모 클래스 를 계승 하거나 하나의 인 터 페 이 스 를 실현 해 야 하지만,최대 하나의 부모 클래스 만 있 거나 하나의 인 터 페 이 스 를 실현 할 수 있 습 니 다.
//
interface Person {
public void eat();
}
public class AnonymousDemo {
public static void main(String[] args) {
//
Person p = new Person() {
public void eat() {
System.out.println("eat something");
}
};
p.eat();
}
}
4.총화5.면접 문제
public class Outer {
public void someOuterMethod() {
// Line 3
}
public class Inner {
}
public static void main(String[] argv) {
Outer o = new Outer();
// Line 8
}
}
/*
* Which instantiates an instance of Inner?
A. new Inner(); // At line 3
B. new Inner(); // At line 8
C. new o.Inner(); // At line 8
D. new Outer.Inner(); // At line 8
*/
답 A.new Inner();this.new Inner()와 같 음;Outer 클래스 대상 이 이미 존재 합 니 다.line 8 정확 한 표기 법 은 o.new Inner()여야 합 니 다.
이상 은 본 고의 모든 내용 입 니 다.본 고의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.또한 저 희 를 많이 지지 해 주시 기 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.