Java 기본 사항 - Java의 내부 클래스란 무엇입니까?

머리말

이 형제님은 이전에 정적인 내부 계층을 설명할 때 내부 계층의 개념에 대해 간략하게 소개했습니다. 하지만 사실 이너 클래스는 그렇게 간단하지 않기 때문에 오늘은 이너 클래스에 대해 구체적으로 설명하고 배워야 합니다.

------------------------------ 전희가 끝나고 재미가 시작됩니다 ----------- -----------------

전체 텍스트는 [ 6500] 단어에 관한 것입니다. 말도 안되는 것이 아니라 기술을 배우고 원리를 이해할 수 있는 순수한 건조 제품입니다! 이 기사에는 사례와 그림이 풍부하여 기사의 기술 개념을 더 잘 이해하고 사용할 수 있으며 충분한 계몽적 사고를 가져올 수 있습니다...

1. 내부 클래스 소개

1. 개념

Java에서는 일반적으로 다른 패키지에 다른 클래스를 만들고 동일한 패키지의 클래스에 대해 모두 동일한 수준에 있습니다. 하지만 사실 또 다른 상황이 있는데, 어떤 클래스는 다른 클래스 내부에 정의되어 있을 수 있는데, 클래스 내부에 정의된 클래스를 내부 클래스(InnerClass) 또는 중첩 클래스라고 하고, 외부에서 정의된 클래스를 외부 클래스라고 합니다. 클래스( OutClass) 또는 호스트 클래스. 즉, 클래스 내에서 멤버 변수와 메서드를 모두 정의할 수 있으며 다른 클래스도 정의할 수 있습니다 . 내부 클래스를 정의하는 일반적인 형식은 다음과 같습니다.

class Outer {//外部类
    
    class Inner {//内部类
        
        //方法和属性
    }
    
}

위의 코드에서 Outer 는 일반 Outer 클래스이고 Inner는 Inner 클래스 입니다 . 일반 외부 클래스와 가장 큰 차이점은 인스턴스 개체가 단독으로 존재할 수 없으며 외부 클래스의 인스턴스 개체에 연결되어야 한다는 것입니다.

내부 클래스는 잘 숨길 수 있습니다.일반적으로 비 내부 클래스는 개인 및 보호 권한을 가질 수 없지만 내부 클래스는 가능하며 내부 클래스도 외부 클래스의 모든 요소에 대한 액세스 권한을 갖습니다 . 요약하면 내부 클래스에 대한 많은 액세스 규칙은 변수와 메서드를 참조할 수 있습니다.

그러나 내부 클래스를 사용하여 프로그램 구조를 더 간결하게 만들 수는 있지만 객체 지향 사고를 어느 정도 파괴한다는 점에 유의해야 합니다.

2. 장점

내부 클래스의 존재는 다음과 같은 이점이 있습니다.

  • 내부 클래스는 다중 상속 솔루션을 더욱 완벽하게 만듭니다. 각 내부 클래스는 독립적으로 인터페이스를 구현할 수 있습니다. 외부 클래스가 인터페이스를 구현했는지 부모 클래스를 상속했는지에 관계없이 내부 클래스에 영향을 미치지 않습니다.
  • 특정 논리적 관계를 가진 클래스를 함께 편리하게 구성할 수 있을 뿐만 아니라 외부 세계로부터 숨길 수도 있습니다.
  • 모든 종류의 이벤트 구동 프로그램을 작성하는 것이 편리합니다.
  • 스레드 코드를 작성하기 쉽습니다.

3. 분류

Java의 내부 클래스는 다음 유형으로 나눌 수 있습니다.

  • 멤버 내부 클래스
  • 정적 내부 클래스
  • 로컬 내부 클래스
  • 익명 내부 클래스

대부분의 경우 내부 클래스는 많이 사용되지 않지만 구체적으로 어떻게 사용되는지 이해해야 합니다.

4. 내부 클래스의 특징

외부 클래스와 비교하여 내부 클래스는 다음과 같은 특징이 있습니다.

  • 내부 클래스는 캡슐화를 깨지 않고 외부 클래스의 개인 멤버에 액세스할 수 있습니다 .
  • 내부 클래스는 여전히 독립 클래스입니다.컴파일 후 내부 클래스는 독립적인 .class 파일 로 컴파일되지만 앞에 외부 클래스의 클래스 이름과 $ 기호가 붙습니다 . 파일 이름의 형식은 다음과 같습니다. 외부 클래스 이름 $ 내부 클래스 이름 .class ;
  • 내부 클래스는 외부 클래스의 멤버이기 때문에 내부 클래스는 정상적인 방법으로 액세스할 수 없지만 내부 클래스는 외부 클래스의 멤버 변수가 private에 의해 수정되었는지 여부에 관계없이 자유롭게 액세스할 수 있습니다.
  • 정적 내부 클래스인 경우 외부 클래스의 멤버 변수에 아무렇게나 액세스할 수 없으며 외부 클래스의 정적 멤버 변수에만 액세스할 수 있습니다.

5. Java 클래스 생성 요구 사항

Java 클래스를 만들고 정의할 때 다음 요구 사항을 따라야 합니다.

  • java 파일에 여러 클래스를 작성할 수 있지만 public 키워드로 수정할 수 있는 클래스는 하나뿐이며, 이를 기본 클래스라고 합니다.
  • 기본 클래스 이름은 파일 이름과 일치해야 하며, 개발 중에는 하나의 Java 파일에 하나의 클래스만 작성하도록 하십시오.
  • 외부 클래스에는 공개 및 기본의 두 가지 액세스 수준만 있고 내부 클래스에는 공개, 보호, 개인 및 기본의 네 가지 액세스 수준이 있습니다.
  • 외부 클래스에서는 내부 클래스의 클래스 이름을 통해 내부 클래스에 직접 액세스할 수 있습니다.
  • 외부 클래스가 아닌 클래스에서는 내부 클래스의 전체 클래스 이름을 통해 내부 클래스에 액세스해야 합니다.
  • 내부 클래스와 외부 클래스는 같은 이름을 가질 수 없습니다.

다음으로 이 형제는 위에서 언급한 몇 가지 내부 클래스의 사용법을 설명할 것입니다.

2. 멤버 내부 클래스

1. 개념

멤버 내부 클래스는 정적에 의해 수정되지 않는 내부 클래스를 말하며, 비정적 내부 클래스라고도 한다.

2. 특징

멤버 내부 클래스에는 다음과 같은 특징이 있습니다.

  • 초기 jdk 버전에서는 최종 및 정적이 모두 수정에 사용되지 않는 한 멤버 내부 클래스에서 비정적 속성 및 메서드만 정의할 수 있습니다.
  • 새 버전의 jdk에서는 멤버 내부 클래스에서도 정적 속성 및 메서드를 정의할 수 있습니다.
  • 멤버 내부 클래스는 다중 수준 중첩에서도 개인 및 정적 멤버를 포함하여 외부 클래스의 모든 멤버에 액세스할 수 있습니다.
  • 외부 클래스는 내부 클래스의 멤버에 직접 액세스할 수 없으며 내부 클래스의 인스턴스 개체를 통해 액세스해야 합니다.
  • 아우터 클래스와 아우터 클래스가 아닌 다른 클래스의 정적 메소드에서는 아우터 클래스의 인스턴스를 통해 이너 클래스의 인스턴스 객체를 생성해야 한다.
  • 외부 클래스의 인스턴스와 내부 클래스의 인스턴스 사이에는 일대다 관계가 있습니다. 즉, 내부 클래스의 인스턴스는 외부 클래스의 하나의 인스턴스에만 대응하지만 외부 클래스의 인스턴스는 내부 클래스의 여러 인스턴스에 해당할 수 있습니다.

3. 문법

외부 클래스에 있는 경우 멤버 내부 클래스 개체를 만드는 기본 구문은 다음과 같습니다.

내부 클래스 객체 이름 = new inner class();

다른 외부 클래스에 있거나 외부 클래스의 정적 메서드에 있는 경우 멤버 내부 클래스 개체를 만드는 기본 구문은 다음과 같습니다.

내부 클래스 개체 이름 = 새 외부 클래스().새 내부 클래스();

4. 사례

4.1 멤버 내부 클래스 정의

/**
 * 成员内部类
 */
public class OuterClass {

	// 外部类的非静态成员
	String name = "一一哥";
	private String hobby = "撸码";
	static int age = 30;

	// 非静态方法
	public void show() {
		//这里的this是指OuterClass对象
		System.out.println("show方法...name="+this.name);

        //如果是在外部类里面创建内部类的对象,就不需要创建外部类实例,可以直接new 内部类()
		//InnerClass inner = new InnerClass();
	}

	// 定义一个成员内部类
	public class InnerClass {
		// 也可以定义私有属性
		private int a = 10;

		//在早期的JDK中,成员内部类中不能定义静态变量;但在新版JDK中,成员内部类中可以定义静态变量
		static int b = 20;

		// 非静态方法
		public void m1() {
			// 这里的this对象是InnerClass内部类对象
			System.out.println("成员内部类的成员变量:" + this.a);
			
			//外部类.this.属性或方法,这个this是外部类对象
			System.out.println("外部类的成员变量:" + OuterClass.this.name);
			
            //内部类中可以访问外部类的私有成员和静态成员
			System.out.println("外部类的私有成员变量:" + hobby);
			System.out.println("外部类的静态变量:" + age);
		}

		//在早期的JDK中,成员内部类中不能定义静态方法;但在新版JDK中,成员内部类中可以定义静态方法
		public static void m2() {
			System.out.println("调用成员内部类的静态变量:" + b);
			System.out.println("调用外部类的静态变量:" + age);

            //在静态方法中创建内部类对象,也要通过内部类 对象名 = new 外部类().new 内部类();的格式
			//InnerClass innerClass = new OuterClass().new InnerClass();
		}

	}

}

초기 JDK에서는 멤버 내부 클래스에서 정적 속성 및 메서드를 정의할 수 없었지만 새 버전의 JDK에서는 멤버 내부 클래스에서 정적 속성 및 메서드를 정의할 수 있습니다. 그리고 서로 다른 위치에 내부 클래스 객체를 생성하는 방법과 이에 대한 구체적인 의미를 파악해야 합니다.

4.2 테스트 클래스 정의

다른 외부 클래스에서 멤버 내부 클래스의 개체를 만들려면 다음 형식을 사용해야 합니다.

내부 클래스 개체 이름 = 새 외부 클래스().새 내부 클래스();

public class InnerClassTest {

	public static void main(String[] args) {
		
		//在外部的其他类中,不能直接创建内部类对象,否则:
		//No enclosing instance of type OuterClass is accessible. 
		//Must qualify the allocation with an enclosing instance of type OuterClass 
		//(e.g. x.new A() where x is an instance of OuterClass).
		//InnerClass inner=new InnerClass();

        //在外部的其他类中创建内部类对象,需要通过如下格式:
		//内部类 对象名 = new 外部类().new 内部类();
		//InnerClass inner=new OuterClass().new InnerClass();
		
		//也可以拆分成如下格式:
		OuterClass outer=new OuterClass();
		InnerClass inner=outer.new InnerClass();
		
		inner.m1();
		
		InnerClass.m2();
		
	}
}

5. 접근 방법 요약

여기에서 공부한 후 내부 클래스와 외부 클래스 간의 호출 액세스 관계로 인해 혼란스러울 수 있으므로 Yi 형제는 모든 액세스 방법을 정리했습니다.

  1. 멤버 내부 클래스는 외부 클래스의 멤버(속성, 메서드)에 액세스하고 [ 직접 액세스하여 사용할 수 있습니다 ];
  2. 외부 클래스에서 멤버 내부 클래스에 액세스하려면 [ 액세스하기 전에 내부 클래스 객체를 직접 생성 ], 즉 new InnerClass() ;
  3. 다른 외부 클래스에서 멤버의 내부 클래스에 액세스하려면 [ 외부 클래스 객체를 생성한 다음 액세스할 내부 클래스 객체를 생성 ] 즉, InnerClass inner=new OuterClass().new InnerClass() ;

6. 이에 대한 참고 사항

이 형제님은 이전에 이것의 기능과 사용법에 대해 말했지만 내부 수업에서 우리는 이것에 대해 다음 두 가지 사항에 주의를 기울일 필요가 있습니다.

  • 외부 클래스와 내부 클래스가 모두 있는 경우 어떤 클래스에서 this가 사용되는지 this는 어떤 클래스의 객체를 나타냅니다.
  • 내부 클래스가 이를 통해 외부 클래스의 속성과 메서드를 호출하려면 외부 클래스 이름.this.property 또는 메서드 이름을 사용해야 합니다 .

3. 로컬 내부 클래스

1. 개념

로컬 내부 클래스는 메서드 내에 정의된 내부 클래스입니다.

2. 특징

로컬 내부 클래스에는 다음과 같은 특징이 있습니다.

  • 로컬 내부 클래스는 메서드에서 개체를 정의하고 만들 수만 있으며 현재 메서드에서만 유효합니다.
  • 외부 클래스의 모든 멤버는 로컬 내부 클래스에서 액세스할 수 있습니다 .
  • 로컬 변수와 같은 로컬 내부 클래스는 액세스 제어 수정자(공용, 개인 및 보호) 및 정적 수정자를 사용할 수 없습니다.
  • jdk 7 버전에서는 로컬 내부 클래스에서 로컬 변수를 사용하는 경우 final 키워드를 명시적으로 추가해야 하며, jdk 8 버전에서는 기본적으로 final 키워드가 추가됩니다.
  • 로컬 내부 클래스는 현재 메서드에서 최종 유형의 매개 변수 및 변수에만 액세스할 수 있습니다. 메서드의 멤버 이름이 외부 클래스의 멤버와 동일한 경우 <OuterClassName>.this.<MemberName> 형식을 사용하여 외부 클래스의 멤버에 액세스할 수 있습니다.
  • 로컬 내부 클래스도 내부 클래스를 포함할 수 있지만 이러한 내부 클래스는 액세스 제어 수정자(공용, 개인 및 보호) 및 정적 수정자를 사용할 수 없습니다.
  • 로컬 변수는 메서드 실행 후 소멸되며 로컬 내부 클래스의 개체는 메모리 복구 메커니즘이 소멸될 때까지 대기합니다. 로컬 내부 클래스의 상수인 경우 상수는 상수 풀에 저장됩니다.

3. 문법

로컬 내부 클래스 개체를 만들기 위한 기본 구문은 다음과 같습니다.

public class PartClass {
    
    public void method() {
        //在方法中定义的内部类,就是局部内部类
        class Inner {
            //属性

            //方法
        }
    }
    
}

4. 사례

4.1 로컬 내부 클래스 정의

로컬 내부 클래스의 케이스 코드를 정의해 봅시다.

/**
 * 
  * 局部内部类---定义在方法中的内部类
 */
public class PartOuterClass {

	//类的成员变量
	String name="一一哥";
    private int age=30;
    static String hobby="java";
    
    public void show() {
    	//局部变量
        //JDK 7之前,匿名内部类和局部内部类中访问外部的局部变量时,该变量需要明确地带有final修饰符
        //final int num = 10;
        
        //Effectively final特性
        int num = 10;
        
        //局部内部类,类似于是方法中的局部对象
        class PartInnerClass{
        	
        	//内部可以正常定义方法
            public void m1() {
            	//访问外部类的非静态成员,可以使用OuterClass.this.成员的格式,也可以直接访问
            	//System.out.println("外部类的成员变量"+name);
                System.out.println("外部类的成员变量"+PartOuterClass.this.name);
                System.out.println("外部类私有的成员变量"+age);
                System.out.println("外部类的静态变量"+hobby);
                
                //局部内部类,可以直接访问方法中的局部变量
                System.out.println("访问局部变量"+num);
            }
            
            //在新版的jdk中,也可以定义静态的属性和方法,老版的jdk则不行
            static int b=10;
            
            public static void m2() {
            	System.out.println("外部类的静态变量,hobby="+hobby+",b="+b);
            }
        }
        
        //创建局部内部类对象
        PartInnerClass inner = new PartInnerClass();
        inner.m1();
        
        //在当前类中,局部内部类可以直接访问静态成员
        PartInnerClass.m2();
        
    }    
    
}

JDK 7 이전에는 익명 내부 클래스 및 로컬 내부 클래스의 외부 지역 변수에 액세스할 때 최종 수정자로 변수를 명시적으로 표시해야 했습니다. 그러나 JDK 8부터는 최종 수정자를 사용할 수 없지만 기본적으로 시스템에서 추가됩니다.

4.2 테스트 클래스 정의

다음으로 위의 경우를 테스트합니다.

public class PartInnerClassTest {

	public static void main(String[] args) {
		//创建外部类对象,调用方法,执行局部内部类
		PartOuterClass outer=new PartOuterClass();
		outer.show();
	}
}

4.3 Effectively final 특성

일반적으로 Java의 로컬 내부 클래스와 익명의 내부 클래스가 로컬 변수에 액세스할 때 내부 클래스와 외부 클래스 간의 데이터 일관성을 보장하기 위해 변수를 final로 수정해야 합니다 . 하지만 Java 8부터는 최종 수식어를 추가할 수 없고 시스템에서 기본적으로 추가합니다.물론 Java 8 이전에는 허용되지 않았습니다. Java는 이 새로운 기능을 효과적으로(효과적으로, 실제적으로) 최종 함수 라고 합니다 .

또한 람다 식에서 로컬 변수를 사용할 때 변수를 종료해야 하므로 사실상 최종 기능은 람다 식의 맥락에서 매우 유용합니다.

실제로 최종 기능은 명시적으로 변수를 최종으로 선언하지 않아도 됩니다. 자동으로 최종 수정자를 추가하지만 최종을 취소하지는 않습니다. 주로 불필요한 작업을 줄이고 개발 시간을 절약합니다.

4. 익명 내부 클래스

1. 개념

익명 내부 클래스는 클래스 이름이 없는 내부 클래스를 말하며 생성 시 new 문으로 선언해야 합니다. 익명 이너 클래스는 아우터 클래스의 아우터 클래스에 정의할 수 없고, 특정 메소드 내부에 익명 클래스(Anonymous Class) 형태로 정의해야 한다. 익명의 내부 클래스는 그 자체로 객체입니다.

일반적으로 메소드의 매개변수가 인터페이스 유형이고 인터페이스가 한 번만 구현되면 익명 내부 클래스의 형태로 정의할 수 있습니다. 또한 인터페이스 구현이 매번 다를 경우 익명 내부 클래스 형태로 정의할 수도 있다. 이 정의 형식을 "인터페이스 콜백" 이라고 부를 수도 있습니다 . 익명 내부 클래스의 코드 형식은 코드를 더 간결하고 간결하며 모듈화합니다.

2. 특징

익명 내부 클래스에는 다음과 같은 특징이 있습니다.

  • 익명 내부 클래스 자체는 개체입니다.
  • 일반적으로 속성과 메서드는 무의미하기 때문에 익명의 내부 클래스에 정의되지 않습니다.
  • 익명 내부 클래스의 부모 클래스는 일반적으로 추상 클래스 또는 인터페이스입니다.
  • 로컬 내부 클래스와 같은 익명 내부 클래스는 외부 클래스의 모든 멤버에 액세스할 수 있습니다.
  • 익명 내부 클래스가 메서드에 있는 경우 클래스는 메서드에 있는 최종 형식의 지역 변수 및 매개 변수에만 액세스할 수 있습니다.
  • 비정적 코드 블록은 익명 내부 클래스의 멤버를 초기화할 수 있습니다.
  • 익명 내부 클래스의 비정적 코드 블록은 부모 클래스의 생성자 다음에 실행됩니다.

3. 문법

일반적으로 익명 내부 클래스에는 두 가지 구현이 있습니다.

  • 클래스를 상속하고 해당 메서드를 재정의합니다.
  • 하나 이상의 인터페이스를 구현하고 해당 메서드를 구현합니다.

익명 내부 클래스 개체를 만들기 위한 기본 구문은 다음과 같습니다.

new <클래스 또는 인터페이스> (){

클래스 또는 인터페이스의 메서드 재정의

}

4. 사례

다음으로 익명 내부 클래스의 사용법을 보여주기 위해 Yi Ge는 버튼 클릭 이벤트를 시뮬레이션하는 사례를 설계합니다. Android와 같은 장치를 개발할 때 패널에 버튼이 있습니다. 버튼을 클릭하면 클릭 이벤트를 모니터링하는 방법은 무엇입니까? 다양한 해당 버튼 클릭 모니터링 이벤트가 Android 시스템에서 제공됩니다. 여기서 Yige는 클릭 이벤트를 시뮬레이트하는 인터페이스를 구현하여 익명의 내부 클래스를 정의합니다.

4.1 인터페이스 정의

먼저 클릭 모니터링을 의미하는 인터페이스를 정의해야 하며 내부에 클릭 이벤트가 있습니다.

/**
 * 点击监听事件
 */
public interface OnClickListener {

	//点击事件
	void onClick();
	
}

4.2 버튼 버튼 클래스 정의

그런 다음 Button 버튼 클래스를 정의하고 Button 버튼에 대한 클릭 모니터링 방법을 마련합니다.

/**
 * 
 * 局部内部类---定义在方法中的内部类
 */
public class Button {

	//处理案例点击的监听事件
    public void setOnClickListener(OnClickListener listener) {
    	
    	listener.onClick();
    }
    
}

4.3 테스트 클래스 정의

다음으로 위의 코드를 테스트하고 실행합니다.

/**
 * 匿名内部类测试
 */
public class AnonyInnerClassTest {

	public static void main(String[] args) {
		//外部变量
		int num=20;
		
		//测试匿名内部类
		Button btn=new Button();
		
		//模拟处理按钮的点击事件
		btn.setOnClickListener(new OnClickListener() {//这里就是一个匿名内部类
			
			//在匿名内部类中,可以允许使用非静态代码块进行成员初始化操作。
			int i; 
			
			{    // 非静态代码块,在构造方法之后执行
		        i = 100;    //成员初始化
		    }
			
			@Override
			public void onClick() {
				System.out.println("按钮被点击啦...i="+i+",num="+num);
			}
		});
		
	}
}

위의 경우에 따르면 다음과 같이 알 수 있습니다.

  • 익명 내부 클래스에서 멤버 초기화 작업에 비정적 코드 블록을 사용할 수 있습니다.
  • 익명 내부 클래스의 비정적 코드 블록은 생성자 다음에 실행됩니다.
  • 익명의 내부 클래스는 외부 클래스의 멤버를 직접 사용할 수도 있습니다.

5. 정적 내부 클래스

1. 개념

정적 내부 클래스와 멤버 내부 클래스의 정의는 비슷하지만 static 으로 데코레이션 해야 하므로 정적 내부 클래스(Static Nested Class)라고 합니다.

정적 이너 클래스와 멤버 이너 클래스는 큰 차이가 있는데 더 이상 Outer 인스턴스 에 붙지 않고 완전히 독립된 클래스이므로 Outer.this를 참조하여 호출할 수 없습니다. 그러나 Outer 클래스전용 정적 필드와 정적 메서드 에 액세스할 수 있으므로 정적 내부 클래스를 Outer 클래스 외부로 이동하면 private 에 대한 액세스 권한을 잃게 됩니다 .

2. 특징

  • 비정적 속성 및 메서드는 정적 내부 클래스에서 정의할 수 있으며 정적 속성 및 메서드도 정의할 수 있습니다.
  • 정적 내부 클래스에서는 정적 외부 클래스의 정적 속성 및 메서드만 액세스할 수 있습니다.

3. 문법

정적 내부 클래스 개체를 만들기 위한 기본 구문은 다음과 같습니다.

내부 클래스 개체 이름 = 새 외부 클래스.내부 클래스();

4. 사례

4.1 정적 내부 클래스 정의

여기서 이형제는 단순히 정적 내부 클래스를 먼저 정의하고 나중에 내부 클래스를 공부할 때 설명하겠습니다. 이 정적 내부 클래스에서 Yige는 외부 클래스의 공통 및 정적 속성에 액세스하는 방법을 정의합니다. 다음 사항을 염두에 두어야 합니다.

  • 정적 내부 클래스가 외부 클래스의 멤버 변수에 액세스할 때 외부 클래스 개체를 먼저 만들어야 합니다.
  • 비정적 내부 클래스는 이 클래스의 변수를 사용하는 것처럼 외부 클래스의 멤버 변수에 직접 액세스할 수 있습니다.
  • 모든 내부 클래스가 외부 클래스의 정적 변수에 접근할 때 "외부 클래스. 정적 변수" 형태로 직접 접근할 수 있다.
/**
 * 外部类和内部类
 */
public class OuterClass {
	
	//普通属性,属于外部类
	static int outerNum=10;
	
	//定义一个静态的内部类,如果不带static,就是一个普通的内部类。
	//内部类的使用,和普通类一样,里面可以正常定义属性、方法、构造方法等。
    //static前面可以带public等任意访问修饰符,也可以不带!
	static class InnerClass{
		//私有属性无法在类的外部直接访问
		//private int innerNum=20;
		
		int innerNum=20;
		
		public void printNum() {
			//定义外部类对象
			OuterClass outer=new OuterClass();

            //这里的this是指InnerClass内部类对象!
			System.out.println("innerNum="+this.innerNum+",outerAge="+outer.outerAge+",outerNum="+OuterClass.outerNum);
		}
	}

}

 정적 내부 클래스의 경우 정적 앞에 public과 같은 액세스 한정자가 올 수 있습니다.

4.2 테스트 클래스 정의

내부 클래스 개체가 어떻게 호출되는지 확인하기 위해 다른 테스트 클래스를 정의해 보겠습니다.

/**
 * 测试访问内部类
 */
public class InnerClassTest {
	
	public static void main(String[] args) {
		//创建内部类对象,格式为“外部类.内部类 对象名 = new 外部类.内部类的构造方法”
		OuterClass.InnerClass inner = new OuterClass.InnerClass();
		
		//调用内部类的方法
		inner.printNum();
		
		//访问外部类属性
	    System.out.println("outerNum="+OuterClass.outerNum);
	    
	    //访问内部类属性
	    System.out.println("innerNum="+inner.innerNum);
	}

}

5. 접근 방법 요약

정적 내부 클래스의 액세스 요구 사항에 대해 Yige는 모두를 위해 다음을 요약합니다.

  1. 정적 내부 클래스는 비공개 클래스를 포함하여 외부 클래스의 모든 정적 메서드에 직접 액세스할 수 있지만 비정적 멤버에는 직접 액세스할 수 없습니다.
  2. 정적 내부 클래스는 상태가 멤버이기 때문에 액세스 수정자(공용, 보호, 기본, 개인)를 추가할 수 있습니다.
  3. 정적 내부 클래스가 외부 클래스의 정적 속성, 정적 메서드 등에 액세스하는 경우 액세스 방법은 [직접 액세스]입니다.
  4. 정적 내부 클래스에 외부 클래스나 다른 외부 클래스가 접근하는 경우 접근 방법은 [외부 클래스.내부 클래스 객체명 = 신규 외부 클래스.내부 클래스 생성 방법]으로 하고 내부 클래스 객체를 생성한 후 접근한다.

------------------------------ 장편 영화 끝났으니 담배 피자 ----------- -----------------

6. 결론

지금까지 이 형제님이 내부 수업을 자세히 소개했는데 지금 배웠나요? 내부 클래스의 핵심 사항을 요약해 보겠습니다.

  • 내부 클래스는 멤버 내부 클래스, 로컬 내부 클래스, 익명 내부 클래스 및 정적 내부 클래스로 나뉩니다.
  • 멤버 내부 클래스와 익명 내부 클래스는 본질적으로 동일하며 외부 클래스의 인스턴스에 연결되어야 하고 암묵적으로 Outer.this 인스턴스를 보유하며 외부 클래스에 대한 개인 액세스 권한을 갖습니다 .
  • 정적 내부 클래스는 독립적인 클래스이지만 외부 클래스의 전용 액세스 권한이 있습니다.
  • 외부 클래스의 멤버와 내부 클래스의 멤버 이름이 같은 경우 내부 클래스는 기본적으로 접근 시 근접 원칙을 따르며, 외부 클래스의 멤버에 액세스하려면 [외부 클래스] 형식을 사용할 수 있습니다. name.member]에 접속합니다.

7. 오늘의 숙제

다음 중 잘못된 설명은 무엇이며 그 이유는 무엇입니까?

내부 클래스는 자체 멤버 메서드와 멤버 변수를 가질 수 없습니다.

b. 내부 클래스는 abstract 수식어를 사용하여 추상 클래스로 정의하거나 private 또는 protected로 정의할 수 있습니다.

c. 내부 클래스는 다른 클래스의 구성원으로 사용될 수 있으며 해당 클래스의 구성원에 액세스할 수 있습니다.

d. 정적 내부 클래스를 제외하고 정적 멤버(정적 상수 제외)는 내부 클래스에서 직접 선언할 수 없습니다.

의견 섹션에 답변을 제공하십시오.

Supongo que te gusta

Origin blog.csdn.net/longz_org_cn/article/details/130004579
Recomendado
Clasificación