자바 내부 수업
1. 의미
Java 프로그래밍 언어에서 프로그램은 수업으로 구축됩니다. 수업은 수업 내에서 선언 될 수 있으며, 우리는 그러한 수업 내부 수업이라고 부릅니다.
2. 기능
• 더 나은 캡슐화를 구현하면 일반 클래스 (비 인자 클래스)에 대한 액세스 수정자는 개인 또는 보호를받을 수 없지만 내부 클래스는 할 수 있습니다. 내부 클래스를 비공개로 선언 할 때 외부 클래스 만 내부 클래스에 액세스하여 내부 클래스를 멋지게 숨길 수 있습니다.
• 내부 클래스는 외부 클래스의 영향을받지 않고 상속 (확장) 또는 다른 클래스 또는 인터페이스를 구현 (구현) 할 수 있습니다.
• 내부 클래스는 비공개로 수정 된 경우에도 외부 클래스의 필드 및 방법에 직접 액세스 할 수 있습니다. 반대로 외부 클래스는 내부 클래스의 구성원에게 직접 액세스 할 수 없습니다.
3. 원리
내부 클래스는 컴파일 타임 개념입니다. 컴파일 후 다음과 같이 두 개의 독립 클래스 파일이 생성됩니다.
공개 클래스 외부 {private String outname = "외부"; 클래스 내부 {private String innerName = "내부"; }}컴파일 된 파일은 다음과 같습니다.
컴파일 후 OUTER.INNER의 이름을 OUTER $ 내부로 바꾸고 기간 (.)이 달러 표시 ($)로 대체됩니다.
IV. 분류
Java 내부 클래스는 회원 내부 클래스, 로컬 내부 클래스, 익명 내부 클래스 및 정적 내부 클래스로 나눌 수 있습니다.
1) 내부 등급의 회원
멤버 내부 클래스는 외부 클래스의 구성원으로 간주 될 수 있습니다. 정적 멤버는 멤버 내부 클래스에서 선언 할 수 없지만 정적 최종 필드는 예외입니다. 클래스가로드되면 정적 멤버가 먼저 초기화 될 것임을 알고 있습니다. 멤버의 내부 클래스에 정적 멤버가있는 경우 내부 클래스는 외부 클래스 전에 생성됩니다. 내부 클래스는 외부 클래스에 서비스를 제공하며 외부 클래스 전에 생성 된 내부 클래스는 제어 불가능할 수 있습니다. 멤버 내부 클래스를 인스턴스화 할 때, 멤버 내부 클래스는 외부 클래스의 현재 객체에 대한 참조를 보유하여 비공개가 수정 된 경우에도 외부 클래스의 구성원에게 직접 액세스 할 수 있습니다.
static java.lang.system.out 가져 오기; 공개 클래스 외부 {private String outname = "외부"; // 외부 클래스는 내부 클래스의 멤버에 직접 액세스 할 수 없으며 내부 클래스 객체 개인 내부 내부 = 새로운 내부 ()를 인스턴스화해야합니다. 공개 클래스 내부 {private String innerName = "Inner"; public void show () {out.println (Outername); // OUTER CLASS}}} public void show () {out.println (inner.innerName); 내부. 쇼우 (); } public static void main (string [] args) {외부 외부 = 새로운 외부 (); outer.show (); // 내부 클래스 outer.inner 내부 = outer.new inner (); 내부. 쇼우 (); }}실행 결과 :
안의
밖의
밖의
멤버 내부 클래스의 외부 클래스 객체에 대한 참조는이 전에 외부 클래스의 이름으로 구성됩니다. 이 양식이 호출됩니다
Limited-This, out.println (outername) 및 out.println (outer.this.outername)은 동일합니다.
2) 지역 내부 수업
로컬 내부 클래스의 사용은 기본적으로 멤버 내부 클래스의 사용과 동일합니다. 로컬 내부 클래스는 로컬 변수와 마찬가지로 외부 클래스의 방법에 정의되며 외부 클래스의 구성원이 아닙니다. 로컬 내부 클래스는 방법 외부에서 접근 할 수 없지만 인스턴스는 메소드에서 반환 할 수 있으며 인스턴스는 더 이상 참조되지 않을 때까지 유지됩니다. 로컬 내부 클래스는 또한 위치의 로컬 변수, 메소드 매개 변수 등에 액세스 할 수 있습니다. 한계는 로컬 변수 또는 메소드 매개 변수가 최종적으로 선언 될 때만 액세스 할 수 있다는 것입니다.
static java.lang.system.out 가져 오기; 공개 클래스 외부 {private String outname = "외부"; public void show (final String str) {// 메소드 매개 변수는 최종 유형 클래스 내부 {public void print () {out.println (outername+str); }} 내부 내부 = 새로운 내부 (); 내부 .print (); } public static void main (string [] args) {외부 외부 = 새로운 외부 (); outer.show ( ": lalala"); }}실행 결과 :
외부 : Lalala
3) 익명 내부 클래스
익명의 내부 클래스가 클래스 이름이없는 로컬 내부 클래스로 상상할 수 있습니다. 익명의 내부 클래스에는 다음과 같은 특성이 있습니다.
1. 익명의 내부 클래스에는 생성자가 없을 수 없습니다. 익명의 내부 클래스에는 클래스 이름이 없으므로 생성자를 선언 할 수 없습니다.
2. 익명 내부 클래스는 인터페이스를 상속하거나 구현해야합니다. New에 할당 된 유형은 익명 클래스의 슈퍼 유형입니다. 익명의 클래스는 조항을 표시하거나 구현할 수 없으며 수정자가 없을 수도 없습니다.
3. 익명의 내부 클래스는 회원의 내부 클래스 및 지역 내부 클래스와 동일하며 정적 회원은 선언 할 수 없습니다.
static java.lang.system.out 가져 오기; 공개 클래스 외부 {private String outname = "외부"; public void show (final String str) {new Inner () {// 내부 인터페이스 구현 public void print () {out.println (Outername+str); }} .print (); } public static void main (string [] args) {외부 외부 = 새로운 외부 (); outer.show ( ": lalala"); }} 인터페이스 내부 {void print (); }실행 결과 :
외부 : Lalala
4) 정적 내부 클래스
일부 책에서 중첩 클래스라고도 불리는 정적 내부 클래스는 선언 할 때 정적 수정자를 사용해야합니다. 정적 내부 클래스는 처음 세 개의 내부 클래스와 다릅니다. 정적 내부 클래스는 외부 클래스의 현재 객체에 대한 참조를 보유하지 않으므로 정적 내부 클래스에서는 외부 클래스의 비 정적 멤버에 액세스 할 수 없습니다. 정적 내부 클래스는 외부 클래스에 의존하지 않는다고 말할 수 있습니다.
static java.lang.system.out 가져 오기; 공개 클래스 외부 {private String outname = "외부"; 개인 정적 int ID = 123; 개인 내부 = 새로운 내부 (); 공개 정적 클래스 내부 {public void print1 () {//out.println(outername); 외부 클래스의 비 정적 멤버는 액세스 할 수 없습니다 .println (id); } public static void print2 () {out.println (id); }} public void show () {inner.print1 (); } public static void main (string [] args) {외부 외부 = 새로운 외부 (); outer.show (); outer.inner.print2 (); // 클래스 이름을 통해 정적 내부 클래스에 턴 액세스}}}