인터페이스 람다 내부 클래스 식 (내부)

셋째, 내부 클래스

내부 클래스로 다음 있기 때문에 클래스는 클래스에서 다른 클래스 내에서 정의된다 :

① 클래스 내의 메소드가 데이터를 액세스 할 수있는 개인 정보를 포함하는 클래스의 정의의 범위.

② 내부 클래스는 같은 패키지의 다른 클래스에 대한 숨길 수 있습니다.

③ 당신이 콜백 함수를 정의 할 수 및 수행 할 때보다 편리 익명의 내부 클래스를 사용하여, 코드를 많이 쓰고 싶지.

내부 클래스가 적용되지 각 내부 클래스는 독립적으로, 일부를 달성하기 위해 상관없이 둘러싸 클래스 (인터페이스)를 상속 여부 구현 (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 ();

    }

}

게시 71 개 원래 기사 · 원의 찬양 (42) ·은 60000 +를 볼

추천

출처blog.csdn.net/dreame_life/article/details/102690878