Java 내부 클래스와 그 인스턴스화 <br /> Java에서는 하나의 클래스 (또는 내부 클래스)라고하는 한 클래스 (또는 메소드 또는 명령문 블록) 내에서 다른 클래스를 정의 할 수 있으며 때로는 중첩 클래스라고도합니다 (중첩 클래스라고도합니다. ).
내부 클래스와 외부 클래스 사이에 논리적 인 관계가 있습니다.
내부 클래스를 사용하는 주된 이유는 다음과 같습니다.
내부 클래스는 개인 데이터를 포함하여 외부 클래스의 데이터에 액세스 할 수 있습니다.
내부 클래스는 같은 패키지의 다른 클래스에서 숨겨 질 수 있습니다.
콜백 함수를 정의하고 많은 코드를 작성하고 싶지 않으면 익명의 내부 클래스를 사용하는 것이 더 쉽습니다.
수업에서 명명 충돌을 줄입니다.
다음 예를 참조하십시오.
공개 클래스 {private int counter = 10; = inner.dostuff (); 내부 클래스.
이 코드는 내부 클래스 내부를 포함하는 외부 클래스 외부를 정의합니다. 오류 명령문을주고 컴파일하면 두 개의 .class 파일이 생성됩니다 : outer.class 및 Outer $ inner.class. 즉, 내부 클래스는 독립 바이트 코드 파일로 컴파일됩니다.
내부 클래스는 가상 머신과 관련이없는 컴파일러 현상입니다. 컴파일러는 내부 클래스를 내부 클래스 이름을 $ 기호로 내부 클래스 이름과 분리하는 일반 클래스 파일로 변환되며 가상 머신은 이에 대해 전혀 모릅니다.
참고 : 내부 클래스의 객체가 생성되기 전에 외부 클래스의 객체가 있어야합니다. 내부 클래스는 외부 클래스에서 멤버 변수에 액세스해야하고 멤버 변수를 인스턴스화해야하기 때문입니다.
내부 클래스는 Java 1.1의 새로운 기능입니다. 일부 프로그래머는 이것이 칭찬할만한 개선이라고 생각하지만 내부 클래스의 구문은 매우 복잡하고 좋은 코드 구조를 심각하게 훼손하며 Java가 C ++보다 간단하다는 설계 개념을 위반합니다.
내부 카테고리는 아름답고 흥미롭지 만 불필요한 기능을 추가 한 것 같습니다. 이 튜토리얼은이 질문에 대한 긍정적 인 답을 제공하지 않습니다.
Java 정적 내부 클래스, 익명 내부 클래스, 회원 내부 클래스 및 로컬 내부 클래스는 정적 일 수 있으며 공개, 보호 및 개인 액세스 컨트롤을 사용할 수 있지만 외부 클래스는 공개 또는 기본값 만 사용할 수 있습니다.
회원 내부 클래스
외부 클래스 내부에서 직접 정의 된 클래스 (메소드 또는 코드 블록 내부가 아님)는 멤버 기반 내부 클래스이며, 외부 클래스의 모든 변수와 방법, 개인조차도 직접 사용할 수 있습니다. 외부 클래스가 내부 클래스의 멤버 변수 및 메소드에 액세스하려면 내부 클래스 객체를 통해 얻어야합니다.
다음 코드를 참조하십시오.
공개 클래스 {public void dostuff () {size ++;
멤버와 같은 내부 클래스는 외부 클래스의 일반적인 멤버와 같습니다.
멤버 스타일의 내부 클래스는 공개, 보호, 개인, 정적, 최종 및 초록을 포함한 다양한 수정자를 사용할 수 있거나 글을 쓰지 않고 작성할 수 있습니다.
정적 수정자가있는 경우 클래스 레벨이면 객체 수준입니다. 클래스 레벨은 외부 클래스를 통해 직접 액세스 할 수 있으며, 객체 수준은 액세스하기 전에 외부 객체로 만들어야합니다.
비 정적 내부 클래스에서는 정적 멤버를 선언 할 수 없습니다.
예를 들어 내부 클래스는 서로 호출 할 수 있습니다.
클래스 A {// B 및 C는 서로를 호출 할 수 있습니다. 클래스 B {} 클래스 C {}}
회원 내부 클래스에 대한 액세스
내부 클래스 레코드의 객체는 멤버 변수의 형태로 의존하는 외부 클래스 객체에 대해 참조하여 외부 클래스 객체를 찾을 수 있고 해당 멤버에 액세스 할 수 있습니다. 이 멤버 변수는 시스템별로 비 정적 내부 클래스에 자동으로 추가됩니다.
1) 내부 클래스에 정의 된 비 정적 변수 및 메소드를 사용하는 경우 먼저 외부 클래스의 객체를 작성한 다음 "OutObjectName.new"연산자로 내부 클래스의 객체를 작성한 다음 메소드를 호출해야합니다. 아래와 같이 내부 클래스 :
공개 클래스 데모 {public static void main (string [] args) {OUTER = OUTER.NEW 내부 (); 클래스 내부 {public void dostuff () {size ++}}
2) 정적 내부 클래스는 외부 클래스의 정적 멤버와 동일합니다. 예는 다음과 같습니다.
공개 클래스 데모 {public static void main (string [] args) {outer.inner.inner.dostuff (); dostuff () {size.out.println ( "size ="+size)};
실행 결과 :
크기 = 1
3) 내부 클래스는 외부 클래스의 구성 요소에 직접 액세스 할 수 있으므로 내부 클래스가 외부 클래스에서 동일한 이름 속성 또는 메소드를 가질 때도 명명 충돌이 발생합니다. 따라서 여러 레이어를 호출 할 때 다음과 같이 지정해야합니다.
공개 Class {private int size (int size) {size. / 외부 클래스의 크기}}}
로컬 내부 수업
로컬 클래스는 코드 블록에 정의 된 클래스입니다. 그것들을 정의하는 코드 블록에서만 볼 수 있습니다.
지역 수업에는 몇 가지 중요한 특성이 있습니다.
지역 수업은 추상적 일 수 있습니다.
다음 코드를 참조하십시오.
공개 클래스 {public int ind = 123; void innertest () {system.out.println (id); 로컬 메소드 (age)} new Inner (). innertest ();
실행 결과 :
512315
익명의 내부 클래스
익명의 내부 클래스는 특별한 형태의 로컬 내부 클래스입니다. 즉,이 클래스의 인스턴스를 가리키는 변수 이름이 없으며 특정 클래스 구현은이 내부 클래스에 작성됩니다.
참고 : 익명 클래스는 상위 클래스를 상속하거나 인터페이스를 구현해야합니다.
익명의 내부 클래스를 사용하여 추상 방법을 구현할 수 없습니다.
초록 클래스 사람 {public acc args) {person p = new child ();
실행 결과 :
뭔가 먹어
보시다시피, 우리는 자녀와 함께 개인 수업을 물려받은 다음 아이 사례를 구현하여 위쪽으로 사람 수업에 대한 참조로 변환했습니다. 그러나 여기서 어린이 수업이 한 번만 사용된다면 독립형 클래스로 작성하는 것이 번거롭지 않습니까?
현재 익명의 내부 클래스가 소개되었습니다. 익명 내부 클래스를 사용한 구현 :
초록 클래스 사람 {public acpract void eat ();} public class demo {public static void main (string [] args) {// person class new person () {public void e at () {system.out.println "무언가를 먹는다");}} .eat ();
보시다시피, 익명 클래스는 사람 클래스를 상속 받고 곱슬 교정기에서 추상 클래스의 방법을 구현합니다.
내부 클래스의 구문은 비교적 복잡하며 실제 개발에 거의 사용되지 않으며 독자는 내부 수업을 학습의 초점으로 간주해서는 안됩니다.