Java Inner Class, C ++, 즉 중첩 클래스에서도 비슷한 개념이 발견됩니다. 언뜻보기에는 내부 수업이 약간 중복되는 것처럼 보일 수 있으며, 초보자에게는 유용성이 그다지 중요하지 않을 수 있지만,이를 심도있게 이해하면 Java 디자이너가 실제로 내부 클래스에서 잘 의도가 좋다는 것을 알게 될 것입니다. 내부 수업을 사용하는 법을 배우는 것은 고급 Java 프로그래밍을 마스터하는 데있어 프로그램 구조를보다 우아하게 설계 할 수 있습니다. 다음은 다음 측면에서 소개됩니다.
생면
공용 인터페이스 목차 {int value ();} 공개 인터페이스 대상 {String readlabel ();} 공개 클래스 상품 {개인 클래스 내용은 {private int i = 11; public int value () {return i; }} 보호 된 클래스 GDESTINATION은 대상 {개인 문자열 레이블; 개인 gdestination (String whereto) {label = whereto; } public String readLabel () {return label; }} public destination dest (문자열 s) {return new gdestination (들); } public contents content () {return new Content (); }} class testgoods {public static void main (String [] args) {goods p = new goods (); 목차 c = p.cont (); 목적지 d = p.dest ( "베이징"); }}이 예에서, 클래스 내용과 gdestination은 클래스 상품 내부에서 정의되며 액세스 레벨을 제어하기 위해 각각 보호 및 개인 수정자가 있습니다. 콘텐츠는 상품의 내용을 나타내며 GDESTINATION은 상품의 목적지를 나타냅니다. 그들은 각각 두 개의 인터페이스 내용과 대상을 구현합니다. 아래의 주요 방법에서는 내용 C와 대상 D를 사용하여 직접 작동 하며이 두 내부 클래스의 이름도 표시되지 않습니다! 이런 식으로 내부 클래스의 첫 번째 이점은 반영됩니다. 다른 사람들이 알기를 원하지 않는, 즉 캡슐화를 숨기는 작업을 숨 깁니다.
동시에, 우리는 외부 클래스의 범위를 벗어난 내부 클래스 객체를 얻는 첫 번째 방법, 즉 외부 클래스의 메소드를 사용하여 생성 및 반환하는 첫 번째 방법을 발견했습니다. 위의 예에서 cont () 및 dest () 메소드가하는 방식입니다. 다른 방법이 있습니까? 물론 구문 형식은 다음과 같습니다.
외피 = 새로운 외부 클래스 (생성자 매개 변수); OUTERCLASS.INNERCLASS 내부 공동체 = OUTEROBJECT.NEW 내부 클래스 (생성자 매개 변수);
비 정적 내부 클래스 객체를 만들 때 먼저 해당 외부 클래스 객체를 만들어야합니다. 이유에 관해서는 또한 다음 주제로 이어집니다.
비 정적 내부 클래스 객체는 외부 클래스 객체에 대한 참조가 있습니다.
지금 예제에 대한 약간의 수정 :
공공 계급 상품 {private valuerate = 2; 개인 클래스 컨텐츠는 내용을 구현합니다. {private int i = 11*valuate; public int value () {return i; }} 보호 된 클래스 GDESTINATION은 대상 {개인 문자열 레이블; 개인 gdestination (String whereto) {label = whereto; } public String readLabel () {return label; }} public destination dest (문자열 s) {return new gdestination (들); } public contents content () {return new Content (); }}수정 된 부분은 빨간색으로 표시됩니다. 여기서 우리는 상품 클래스에 가치있는 개인 회원 변수를 추가합니다. 즉, 상품의 가치 계수를 의미합니다. 내부 클래스 내용 메소드 값 ()이 값을 계산할 때 곱하십시오. value ()가 Valuerate에 액세스 할 수 있음을 발견했습니다. 이는 내부 클래스의 두 번째 이점 인 내부 클래스 객체가 개인 변수를 포함하여 생성 된 외부 클래스 객체의 내용에 액세스 할 수 있습니다! 이것은 디자인 할 때 더 많은 아이디어와 지름길을 제공하는 매우 유용한 기능입니다. 이 기능을 구현하려면 내부 클래스 객체에 외부 클래스 객체에 대한 참조가 있어야합니다. Java 컴파일러가 내부 클래스 객체를 생성하면 외부 클래스 객체에 대한 참조를 암시 적으로 전달하여 항상 저장합니다. 이를 통해 내부 클래스 객체는 항상 외부 클래스 객체에 액세스 할 수 있으므로 외부 클래스 조치 범위를 벗어나 외부 클래스 객체를 먼저 만들어야합니다.
어떤 사람들은 내부 클래스의 멤버 변수가 외부 클래스의 멤버 변수와 동일한 경우, 즉 외부 클래스에서 동일한 이름의 멤버 변수가 차단되는 경우 어떻게해야합니까? 괜찮습니다. Java는 다음 형식을 사용하여 외부 클래스에 대한 참조를 표현합니다.
외부 클래스
그것으로, 우리는 그러한 차단 상황을 두려워하지 않습니다.
정적 내부 클래스
평범한 클래스와 마찬가지로 내부 클래스도 정적 일 수 있습니다. 그러나 비 정적 내부 클래스와 비교할 때, 차이점은 정적 내부 클래스가 외부에 대한 참조가 없다는 것입니다. 이것은 실제로 C ++의 중첩 클래스와 매우 유사합니다. Java 내부 클래스와 C ++ 중첩 클래스의 가장 큰 차이점은 외부에 대한 언급이 있는지 여부입니다. 물론 디자인의 관점과 그 세부 사항과 차이가 있습니다.
또한, 임의의 비 정적 내부 클래스에서는 정적 데이터, 정적 메소드 또는 다른 정적 내부 클래스가있을 수 없습니다 (내부 클래스는 둘 이상의 레이어 중첩 될 수 있음). 그러나 정적 내부 클래스는이 모든 것을 가질 수 있습니다. 이것은 또한 둘 사이의 두 번째 차이입니다.
로컬 내부 수업
예, Java 내부 클래스는 로컬 일 수 있으며 방법이나 코드 블록 내에서 정의 할 수 있습니다.
공개 클래스 goods1 {공개 대상 DEST (문자열 s) {클래스 gdestination은 대상 {개인 문자열 레이블; 개인 gdestination (String whereto) {label = whereto; } public String readLabel () {return label; }} 새로운 gdestination을 반환합니다. } public static void main (String [] args) {goods1 g = new goods1 (); 목적지 d = g.dest ( "베이징"); }}이것은 위의 예입니다. 방법에서 우리는 내부 클래스를 정의하고 마지막 으로이 메소드는이 내부 클래스의 객체를 반환합니다. 내부 클래스를 사용할 때 객체 중 하나를 만들어 외부로 만 만들면됩니다. 물론, 방법에 정의 된 내부 클래스는 설계를 다각화 할 수 있으며, 목적은 이러한 의미에서만이 아닙니다.
더 기괴한 예는 다음과 같습니다.
공개 클래스 goods2 {private void 내부 트래킹 (boolean b) {if (b) {클래스 추적 슬립 {private String id; trackingslip (String s) {id = s; } string getSlip () {return id; }} trackingslip ts = new TrackingsLip ( "slip"); 문자열 s = ts.getSlip (); }} public void track () {내부 트래킹 (true); } public static void main (String [] args) {goods2 g = new goods2 (); g.track (); }}IF 이외의 내부 클래스의 객체를 만들 수는 없습니다. 왜냐하면 이것은 그 범위를 벗어나기 때문입니다. 그러나 컴파일 할 때 내부 클래스 추적 슬립은 다른 클래스와 동시에 컴파일되지만 자체 범위로 인해이 범위를 초과하면 유효하지 않습니다. 이 외에도 다른 내부 클래스와 다르지 않습니다.
익명의 내부 클래스
Java의 익명 내부 클래스의 구문 규칙은 약간 이상하게 보이지만 익명 배열과 마찬가지로 클래스의 객체 만 만들어야하고 이름을 사용할 수 없을 때 내부 클래스를 사용하면 코드를 간결하고 명확하게 만들 수 있습니다. 구문 규칙은 다음과 같습니다.
new interfaceName () {......}; 또는 새 SuperClassName () {......};계속해서 예를 들어 봅시다.
공개 클래스 goods3 {public contents content () {return new Contents () {private int i = 11; public int value () {return i; }}; }}여기서, metys cont ()는 익명의 내부 클래스를 사용하여 인터페이스 내용의 클래스를 구현하는 객체를 직접 반환합니다.
Java의 이벤트 처리를위한 익명 어댑터에서 익명의 내부 클래스가 널리 사용됩니다. 예를 들어, 창을 닫으려면이 코드를 추가하십시오.
frame.addwindowlistener (new WindowAdapter () {public void WindowClosing (windowevent e) {system.exit (0);}});주목할만한 점은 익명의 내부 클래스에 이름이 없기 때문에 생성자가 없기 때문에 (이 익명의 내부 클래스에 인수가있는 생성자 만 포함하는 부모 클래스를 상속하는 경우, 수퍼 키워드를 사용하여 Super Keyword를 사용하여 구현 과정에서 해당 콘텐츠를 호출해야합니다). 멤버 변수를 초기화하려면 몇 가지 방법이 있습니다.
메소드의 익명 내부 클래스 인 경우이 메소드를 사용하여 원하는 매개 변수를 전달할 수 있지만 이러한 매개 변수는 최종적으로 선언해야합니다.
익명의 내부 클래스를 지명 된 로컬 내부 클래스로 개혁하여 생성자를 가질 수 있도록하십시오.
이 익명의 내부 클래스에서 초기화 코드 블록을 사용하십시오.
내부 클래스가 필요한 이유는 무엇입니까?
Java 내부 클래스의 이점은 무엇입니까? 내부 클래스가 필요한 이유는 무엇입니까?
먼저 간단한 예를 들어 봅시다. 인터페이스를 구현하려면이 인터페이스의 하나의 메소드가 상상했던 클래스의 하나의 메소드와 동일한 이름과 매개 변수를 가지고 있다면 어떻게해야합니까? 현재이 인터페이스를 구현하기 위해 내부 클래스를 만들 수 있습니다. 내부 클래스는 외부 클래스의 모든 내용에 액세스 할 수 있으므로이 인터페이스를 직접 구현하는 모든 기능을 수행 할 수 있습니다.
그러나 당신은 의문을 제기해야 할 수도 있습니다. 방법을 변경하기에 충분하지 않습니까?
실제로, 이것을 내부 카테고리를 설계하는 이유로 사용하는 것은 실제로 확신이 없습니다.
진짜 이유는 Java의 내부 클래스와 인터페이스가 C ++ 프로그래머가 종종 불만을 제기하는 문제를 해결하기 위해 결합되어 있기 때문입니다. 더 이상 상속이 없기 때문입니다. 실제로 C ++의 다중 상속은 설계에 매우 복잡하며 Java는 내부 클래스 및 인터페이스를 통해 다중 상속의 효과를 달성 할 수 있습니다.
Java 내부 클래스 요약
(1) 메소드간에 정의 된 비 정적 내부 클래스 :
● 주변 및 내부 클래스는 서로 자신의 개인 구성원에 액세스 할 수 있습니다.
● 정적 멤버 변수는 내부 클래스에서 정의 할 수 없습니다.
외부 클래스의 범위에서 내부 클래스 객체를 만들려면 먼저 외부 클래스 객체를 만들어야합니다.
(2) 방법간에 정의 된 정적 내부 클래스 :
● 외부 클래스의 정적 멤버 만 액세스 할 수 있습니다.
정적 내부 클래스는 외부에 대한 언급이 없습니다
(3) 방법에 정의 된 로컬 내부 클래스 :
●이 내부 클래스에는 액세스 제어 권한이 없습니다.
● 주변 클래스는이 방법에서 로컬 내부 클래스를 볼 수 없지만 로컬 내부 클래스는 주변 클래스의 모든 구성원에 액세스 할 수 있습니다.
● 메소드 본문에서 로컬 내부 클래스에 액세스 할 수 있지만 로컬 내부 클래스를 정의한 후에는 액세스 명령문이 있어야합니다.
● 로컬 내부 클래스는 방법 본문에서 상수 만 액세스 할 수 있습니다. 즉, 최종적으로 수정 된 구성원.
(4) 방법에 정의 된 익명 내부 클래스 :
● 생성자가없고 대신 생성자 매개 변수를 슈퍼 클래스 생성자로 전달합니다.
클래스의 객체 만 생성하고 이름을 사용하지 않으면 익명의 내부 클래스를 사용하면 코드를 간결하고 명확하게 만들 수 있습니다.
위의 기사는 Java의 내부 및 익명 수업을 종합적으로 이해하는 것이 내가 공유 한 모든 내용입니다. 나는 그것이 당신에게 참조를 줄 수 있기를 바랍니다. 그리고 당신이 wulin.com을 더 지원할 수 있기를 바랍니다.