Jam's story
중첩 클래스 와 중첩 인터페이스 본문
특정한 관계를 맺은 경우, 클래스 내부에 선언하는 것이다
class ClassName{
class NestedClassName{
}
}
class ClassName{
interface NestedClassName{
}
}
클래스의 멤버로서 선언되는 중첩클래스 = 멤버클래스 ->객체가 사용중이면 언제든지 재사용 가능
메소드 내부에서 선언되는 중첩 클래스= 로컬클래스 ->메소드가 실행될때만 사용할 수 있음
-멤버클래스
A$B.class
A가 바깥 클래스, B가 멤버클래스
-로컬클래스
A$1B.class
A가 바깥 클래스, B가 로컬클래스
인스턴스 멤버 클래스
static 필드와 메소드는 선언할 수 없다
class A{
class B{
}}
A a=new A();
A.B b=a.new B();
정적 멤버 클래스
모든 종류의 필드와 메소드를 선언할 수 있다 .
class A{
static class C{
}
}
정적 멤버 클래스의 객체를 생성하기 위해서 , 바깥 클래스의 객체를 만들 필요가 없다.
A.C c=new A.C();
c.field1=3;
A.C.method1();
로컬 클래스
메소드 내부에 있는 중첩 클래스
접근제한자 (private, public. static )을 붙일 수 없다.
로컬 클래스 내부에는 인스턴스 필드와 메소드만 선언가능
void method(){
class D{
}
D d=new D();
d.filed1=3;
d.method1();
}
로컬클래스는 메소드가 실행될때, 메소드 안에서 객체를 생성하고 사용한다.
인스턴스 멤버 클래스는 바깥클래스의 인스턴스 필드의 초기값이나 인스턴스 메소드에서 객체를 생성할 수 있으나 정적 필드의 초기값이나 정적 메소드에서는 객체를 생성할 수 없다.
반면, 정적 멤버클래스는 모든 필드의 초기값이나 모든 메소드에서 객체를 생성할 수 있다.
package twoInterface;
public class A1 {
B field11=new B();
C field1=new C();
void method1() {
B var1=new B();
C var2=new C();
}
static B field3= new B(); //붚가능
static C field4=new C();
static void method2() {
B var1= new B(); //블가능
C var2=new C();
}
class B{}
static class C{}
}
정적 멤버클래스, 자기 내부에 선언하는거는 모든 필드와 메소드를 선언할 수 있지만
바깥클래스에 접근할때에는 정적 필드, 정적메소드에만 접근할 수 있다.
선언은 다 가능하지만 접근! 할때는 정적 필드,메소드만 가능
로컬 클래스에서 사용된 매개변수와 로컬변수는 모두 final 특성을 가진다.
중첩클래스에서 바깥클래스 참조 얻기
package twoInterface;
class Outter {
String field="Outter-field";
void method() {
System.out.println("outter-method");
}
class Nested{
String field1="nested-field";
void method() {
System.out.println("nested-method");
}
void print() {
System.out.println(this.field1);
this.method();
System.out.println(Outter.this.field);
Outter.this.method();
}
}
public static void main(String args[]) {
Outter outter=new Outter();
Outter.Nested nested=outter.new Nested();
nested.print();
}
}
중첩 인터페이스
package twoInterface;
public class Button {
OnClickListener listener;
void setOnClickListener(OnClickListener listener) {
this.listener=listener;
}
void touch() {
listener.onClick();
}
interface OnClickListener{
void onClick();
}
}
클래스 내부에 선언된 중첩 인터페이스를 구현한 객체만 받아야 한다고 하면 , 중첩 인터페이스릃 선언
'자바' 카테고리의 다른 글
예외처리 (0) | 2022.02.02 |
---|---|
자바 구구단 3행 3열로 입력받아 출력 중복은 제외 (0) | 2022.01.31 |
이것이자바다 8장 확인문제 (0) | 2022.01.27 |
인터페이스 상속 (0) | 2022.01.26 |
상속과 인터페이스의 다른점 (0) | 2022.01.26 |
Comments