셋째, 내부 클래스
내부 클래스로 다음 있기 때문에 클래스는 클래스에서 다른 클래스 내에서 정의된다 :
① 클래스 내의 메소드가 데이터를 액세스 할 수있는 개인 정보를 포함하는 클래스의 정의의 범위.
② 내부 클래스는 같은 패키지의 다른 클래스에 대한 숨길 수 있습니다.
③ 당신이 콜백 함수를 정의 할 수 및 수행 할 때보다 편리 익명의 내부 클래스를 사용하여, 코드를 많이 쓰고 싶지.
내부 클래스가 적용되지 각 내부 클래스는 독립적으로, 일부를 달성하기 위해 상관없이 둘러싸 클래스 (인터페이스)를 상속 여부 구현 (Interface)를 상속
1 액세스 개체 클래스의 내부 상태를 사용하여
내부 클래스는, 자신의 데이터 필드를 액세스 또한 둘러싸는 클래스 개체에 액세스 할 수있는 데이터 필드를 만들 수 있습니다.
컴파일시에 컴파일러가 내부 클래스에 대한 기본 생성자를 생성, 클래스를 둘러싸는 매개 변수에 대한 참조를 추가합니다.
공용 B (A의 a) {
외측은 A =;
}
클래스는 클래스 내부의 메커니즘을 설명하기 위해 사용, 주변 장치, 외부 키워드가 없습니다.
2 내부 클래스별로 (문법)
공용 클래스 OuterClass {
개인 문자열 이름;
개인 INT 나이;
/ ** **을 생략 게터와 setter 메소드 /
공용 클래스 InnerClass {
공공 InnerClass () {
= "chenssy을"이름;
나이 = 23;
}
공공 무효 표시 () {
에서 System.out.println ( "이름"+ getName () + "; 나이 :"+ getAge ());
}
}
공공 정적 무효 메인 (문자열 []에 args) {
OuterClass outerClass 새로운 OuterClass을 () =;
OuterClass.InnerClass innerClass = outerClass.new InnerClass ();
innerClass.display ();
}
}
개체 클래스 내부 기준의 유형을 지정해야합니다 ①
OuterClassName.InnerClassName
② 내부 클래스 개체를 만들 때
OuterClass.InnerClass innerClass = outerClass.new InnerClass ();
③ 필요가 외부 클래스 개체에 대한 참조를 생성, 사용 OuterClassName.this
참고 : 클래스에서 선언 된 모든 내부 정적 필드는 도메인이 마지막이 아닌 경우 각각, 클래스의 내부 인스턴스를해야합니다, 때문에 각 외부 개체에 대한 최종해야합니다, 그것은 아마 유일한 아니다.
내부 클래스는 정적 메소드를 가질 수 없습니다
내부 컴파일러 클래스에 관계없이 가상 머신의 컴파일러는 $ 분리 된 기존의 외부 클래스 파일 클래스와 내부 클래스 명과 내부 클래스로 변환합니다, 현상이다
예를 들면 :
OuterClass.class 및 OuterClass $ InnerClass.class : 두 클래스 파일을 클래스와 InnerClass의 내부라는 클래스를 둘러싸는, 성공적인 컴파일 후, 너무있을 것 OuterClass
내부 클래스 3 부재
내부 클래스의 구성원은 둘러싸는 클래스의 멤버는 가장 일반적인 내부 클래스는, 액세스에 대한 모든 속성과 메서드는 클래스의 주변 구성원은 그 클래스 내에서 둘러싸는 클래스 멤버 속성, 무제한 개인이기는하지만 액세스 할 수 있습니다되도록 및 방법에 액세스 할 내부 클래스의 인스턴스가 될 수 있습니다.
주 : ① 내부 클래스의 멤버는, 정적 변수 및 방법, ② 내부 클래스 연결된 주변 카테고리의 멤버 만이 존재하는 내부 주연 클래스를 생성하는 클래스를 생성 할 수 없다.
공용 클래스 OuterClass {
개인 문자열 str을;
공공 무효 outerDisplay () {
에서 System.out.println ( "outerClass ...");
}
공용 클래스 InnerClass {
공공 무효 innerDisplay () {
내 주연 // 속성 사용
STR = "chenssy ...";
에서 System.out.println (STR);
// 주연 내에서 사용
outerDisplay ();
}
}
/ * 권장하는 getXXX () 클래스의 내부 부재를 얻을에 특히 내부 클래스 생성자 매개 변수 없음 * /
공공 InnerClass getInnerClass () {
) (새 InnerClass를 반환;
}
공공 정적 무효 메인 (문자열 []에 args) {
OuterClass 외측 새로운 OuterClass = ();
() = 내측 outer.getInnerClass OuterClass.InnerClass // 내부 클래스의 메소드를 호출하는 클래스 내부 객체를 생성 할
inner.innerDisplay ();
}
}
도 4에 도시 된 바와 같이, 부분 내측 클래스
지역 내부 클래스는 주로 더 복잡한 문제를 해결하는 데 사용되는이 클래스의 사용 방법 및 범위에 중첩되어, 우리의 솔루션을 지원하는 클래스를 만들려면, 우리는 원하지 않는이 클래스는, 그래서 대중에게 있습니다 로컬 내부 클래스로서, 로컬 내부 클래스를 생성 클래스 내측 부재를 컴파일되어 있지만 그 범위가 변경 될 때, 단지 실패 방법 및 특성과 방법의 특성에 사용될 수있다.
그것은 공공 또는 민간 지정자로 선언 할 수 없습니다.
①에있어서의 정의
공용 클래스 Parcel5 {
공공 Destionation의 destionation (문자열 STR) {
클래스 PDestionation 구현 Destionation {
개인 문자열 라벨;
개인 PDestionation (문자열 분에서만) {
라벨 분에서만를 =;
}
공공 문자열 readLabel () {
라벨을 반환;
}
}
새로운 PDestionation (STR)을 반환;
}
공공 정적 무효 메인 (문자열 []에 args) {
Parcel5 parcel5 = 새로운 Parcel5 ();
Destionation의 D = parcel5.destionation ( "chenssy");
}
}
② 범위에 정의 된
공용 클래스 Parcel6 {
개인 무효 internalTracking (부울 b) {
경우 (b) {
클래스 TrackingSlip {로컬 내부 클래스의 // 정의
개인 문자열 아이디;
TrackingSlip (문자열들) {// 생성자
번호 = S;
}
문자열 getSlip () {
ID를 반환;
}
}
TrackingSlip의 TS = 새로운 TrackingSlip ( "chenssy");
문자열 문자열 ts.getSlip을 () =;
}
}
공공 무효 트랙 () {
(참) internalTracking;
}
공공 정적 무효 메인 (문자열 []에 args) {
Parcel6 parcel6 = 새로운 Parcel6 ();
() parcel6.track;
}
}
5 익명 내부 클래스
button2.addActionListener (
새의 ActionListener () {
공공 무효의 actionPerformed (ActionEvent를 전자) {
에서 System.out.println ( "당신은 버튼 II를 누르십시오");
}
});
① 익명의 내부 클래스는 액세스 한정자가 없습니다
첫째가 ②new 익명의 내부 클래스
익명 내부 클래스 시간 파라미터 경우 사용시 ③ 파라미터 최종적으로 설정된다.
④ 익명의 내부 클래스는 생성자가 없습니다.
6 정적 내부 클래스
사용 정적 수정 정적 내부 클래스라고합니다. 정적 내부 클래스와 비 정적 내부 클래스의 가장 큰 차이점 사이에, 우리는 암묵적으로 그 바깥 쪽을 만든 클래스,하지만 정적 내부 클래스에 포인트하지만 참조를 보유 것이다 번역 완료 후 그 비 정적 내부 클래스를 알고 NO. 이 인용 수단없이 :
①의 창조를 둘러싸는 클래스에 의존하지 않는다
②는 비 정적 멤버 변수 및 클로징 클래스의 방법을 사용할 수 없다.
③ 종래 내부 클래스 정적 필드 및 메소드 정적 내부 클래스 다르다.
④ 인터페이스의 클래스 선언 내에서 자동으로 정적 및 public 클래스가된다.
공용 클래스 OuterClass {
개인 문자열 섹스;
공공 정적 문자열 이름 = "chenssy";
/ **
* 정적 내부 클래스
* /
정적 클래스 InnerClass1 {
/ * 고정 부재 정적있을 수도 내부 클래스 * /
공공 정적 문자열 _name1 = "chenssy_static";
공공 무효 표시 () {
/ *
* 정적 내부 클래스 수에만 접속 부재 정적 변수 및 클로징 클래스의 메소드
* 비 정적 멤버 변수 및 방법은 주연 카테고리에 액세스 할 수없는
* /
에서 System.out.println ( "높은 급에 이름 :"+ 이름);
}
}
/ **
* 비 정적 내부 클래스
* /
클래스 InnerClass2 {
/ * 비 정적 내부 클래스는 정적 멤버를 가질 수 없습니다 * /
공공 문자열 _name2 = "chenssy_inner";
/ * 비 정적 내부 클래스는 정적 또는 비 정적인지, 클로징 클래스의 구성원을 호출 할 수 * /
공공 무효 표시 () {
에서 System.out.println ( "OuterClass 이름 :"+ 이름);
}
}
공공 무효 표시 () {
/ * 둘러싸 클래스 액세스 정적 내부 클래스 : 내부 클래스 * /.
에서 System.out.println (InnerClass1._name1);
인스턴스를 생성 할 수 있습니다 / * 정적 내부 클래스는 주변 클래스에 의존 할 필요가 없습니다 * /
새로운 InnerClass1 () 표시 ().;
/ * 클래스에 의존 할 필요가의 비 정적 내주 만들기 * /
. OuterClass.InnerClass2 inner2 = 새로운 OuterClass () 새로운 InnerClass2 ();
지지 부재 / * 비 정적 내부 클래스 * / 비 정적 내부 클래스의 예를 사용해야
에서 System.out.println (inner2._name2);
() inner2.display;
}
공공 정적 무효 메인 (문자열 []에 args) {
OuterClass 외측 새로운 OuterClass = ();
outer.display ();
}
}