内部クラスと匿名クラス
内部クラスと匿名クラス
内部クラス
クラスに別のクラスが存在します
あまり使わない
2つのクラスのメンバーへのアクセスが容易
しかし论理が复雑になり始めると、かえって葛藤の可能性が増す.
// outerclass
package Inner;
public class OuterClass {
int num = 10;
String str1 = "java";
static String str2 = "world";
public OuterClass() {
System.out.println("this is OuterClass");
}
class InnerClass {
int num = 20;
// 이런식으로 바깥 클래스의 데이터를사용 가능
String str3 = str1;
public InnerClass() {
System.out.println("this is InnerClass");
}
}
static class SInnerClass {
int num = 30;
// 이런식으로 바깥 클래스의 데이터를사용 가능
String str4 = str2;
public SInnerClass() {
System.out.println("this is static InnerClass");
}
}
}
// main
package Inner;
public class MainClass {
public static void main(String[] args) {
OuterClass oc = new OuterClass();
System.out.println("outer class num = " + oc.num);
System.out.println("outer class str1 = " + oc.str1);
System.out.println(" ---- ");
// 도트노테이션으로 이너클래스에 접근
// 비정적 중첩 클래스는 바깥 클래스의 객체를 통해 객체를 만들어야함
// in은 oc에 대한 '숨은 외부 참조'를 갖게 됨
// 따라서 클래스 안에서 this. 를통해 바깥 클래스의 요소에 접근 가능
OuterClass.InnerClass in = oc.new InnerClass();
System.out.println("inner class num = " + in.num);
System.out.println("inner class num = " + in.str3);
System.out.println(" ---- ");
// 정적 중첩 클래스는 바깥 클래스의 객체가 없어도 객체를 생성할 수 있음
// 정적 중첩 클래스는 외부 인스턴스 없이 생성 가능하므로 '외부 참조'가 존재하지 않음
// 따라서 클래스 안에서 this. 를 통해 바깥 클래스의 요소에 접근할 수 없다.
OuterClass.SInnerClass sin = new OuterClass.SInnerClass();
System.out.println("static inner class num = " + sin.num);
System.out.println("static inner class num = " + sin.str4);
System.out.println(" ---- ");
}
}
/*
결과
this is OuterClass
outer class num = 10
outer class str1 = java
----
this is InnerClass
inner class num = 20
inner class num = java
----
this is static InnerClass
static inner class num = 30
static inner class num = world
----
*/
外部参照の欠点から内部クラスを作成する場合は、できるだけ静的にする必要があります.インスタンスの作成時に
匿名クラス
// ananymousclass
package Inner;
public class AnonymousClass {
public AnonymousClass() {
System.out.println("this is anonymousclass");
}
public void method() {
System.out.println("this is anonymousclass's original method");
}
}
// main
package Inner;
public class MainClass {
public static void main(String[] args) {
// 익명클래스
// 이름이 없다. 따라서 한번만 사용하고 버려짐
new AnonymousClass() {
@Override
public void method() {
System.out.println("this is override");
};
}.method();
// 재정의한 메서드를 바로 사용
}
}
/*
결과
this is anonymousclass
this is override
*/
// 오버라이드한 결과가 출력됨을 알 수 있다.
Reference
この問題について(内部クラスと匿名クラス), 我々は、より多くの情報をここで見つけました https://velog.io/@jajubal/내부클래스와-익명클래스テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol