클래스 멤버로 선언된 클래스
public classA{
pulic classB{
}
}
클래스 멤버로 선언된 인터페이스
class ClassA{
interface InterfaceA{
}
}
해당 클래스에서만 사용하는 클래스/인터페이스가 필요할 때 활용되며 중첩 인터페이스는 UI 컴포넌트 내부 이벤트 처리에 많이 활용됨
분류 | 선언위치 | 설명 |
---|---|---|
인스턴스 멤버 클래스 | 클래스 내부 | A객체 생성해야만 사용할 수 있는 중첩 클래스 |
정적 멤버 클래스 | 클래스 내부 | A클래스로 바로 접근 가능한 중첩 클래스 |
로컬 클래스 | 메소드 내부 | method가 실행할 때만 사용할 수 있는 중첩 클래스 |
class A{
class B{
B(){...}
int field1;
void method1();
|
}
A a = new A();
A.B b = a.new B();
b.field1 = 3;
b.method1();
class A{
static class B{
B(){...}
int field1;
static int field2;
void method1(){...}
static void method2(){...}
}
|
A.B b = new A.B();
c.field1 = 3;
c.method1();
A.C.field2 = 3;
A.C.method2();
void method(){
class A(){
A(){...}
int field1;
void method1(){...}
}
A a = new A();
a.field1 = 3;
a.method1();
}
void method(){
class DownloadThread extends Thread{...}
DownloadThread thread = new DownloadThread();
thread.start();
}
public class A{
class B{}
static class C(){}
B b = new B();
C c = new C();
void method1(){
B b1 = new B();
C c1 = new C();
}
static B staticB = new B(); //X
static C staticC = new C();
static void method2(){
B b2 = new B(); ///X
C c2 = new C();
}
|
class A{
int field1;
void method1();
static int field2;
static void method2();
class B{
void method(){
field1 = 10;
method1();
field2 = 10;
method2();
}
}
static class C{
void method(){
field2 = 10;
method2();
}
}
}
public void method2(int args){
int localVariable = 1;
class Inner{
public void method(){
int result = args + localVariable;
}
}
}
public class Outter{
String field = "Outter-field";
void method(){
System.out.println("Outter-method");
}
class Nested{
String field = "Nested-field";
void method(){
System.out.println("Nested-method");
}
void println(){
System.out.println(this.field);
this.method();
System.out.println(Outter.this.field);
Outter.this.method();
}
}
}
public class Button{
OnClickListener listener;
void setOnClickListener(OnClickListener listener){
this.listener = listener;
}
void touch(){
listener.onClick();
}
interface OnClickListener{
void onClick();
}
}
이름이 없는 객체로 단독 생성 불가능하고, 필드의 초기값, 로컬 변수의 초기값, 매개변수의 매개값으로 주로 대입됨
class A{
Parent field = new Parent(){
int childField;
void childMethod(){}
@Override
void parentMethod(){}
};
|
익명 객체 내부에서만 사용되며 외부에서는 접근할 수 없음