public class InnerTest{
public static void main(String[] args) {
//Inner의 method2 호출
//1. Outer 객체 생성
Outer o = new Outer();
//2. Inner 인스턴스화
Outer.Inner in = o.new Inner();
//3. Inner 인스턴스 in을 사용한 Inner의 인스턴스 메서드 호출
in.method2(50);
}
}
//내부클래스 예시: 안드로이드 앱 개발에 종종 쓰임
class Outer{
int value = 10;
class Inner{ //인스턴스 클래스
int value = 20;
void method2(int value){
System.out.println(value); //인자값
System.out.println(this.value); //20
System.out.println(Outer.this.value); //10
}
}
static class Inner2{ //static 클래스
}
void method(){
class Inner3{ //지역클래스
}
}
}
DrawShape의 addWindowListener -> class를 익명내부클래스로 쓴거
인터페이스,추상클래스,일반클래스에서 전부 쓸 수 있음
//1. DrawShape.java - 일반클래스를 익명클래스로
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e){
System.exit(0);;
}
});
//2. AnnoInner2.java - 인터페이스를 익명클래스로
Button bt1 = new Button();
bt1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e){
//인터페이스의 추상메서드 구현
}
});
/*
* 1. bt1.addActionListener(); 메소드가 매개변수로 ActionListener를 받아들이는데,
* 2. ActionListener는 인터페이스 이기때문에 그 자체로는 인스턴스 생성을 할 수 없다. (*인터페이스는 전부 추상메소드여서 생성자도 구현부가 없어 객체생성불가)
* 3. 하지만 ActionListener 인터페이스를 구현하는 클래스는 객체를 생성할 수 있다.
* 4. 그래서 class EventHandler를 만들어서 인터페이스 ActionListener를 구현한다.
* 5. 인터페이스의 다형성을 이용해 EventHandler타입을 ActionListener에 담을 수 있다.
* 6. 담은 그 매개변수를 bt1.addActionListener(매개변수); 에 넣어주면 된다.
*/
//3. AnnoInner.java - 인터페이스 구현체로 객체 생성
public class AnnoInner {
public static void main(String[] args){
Button bt1 = new Button();
ActionListenr e1 = new EventHandler(); //인터페이스의 다형성
bt1.addActionListener(e1);
}
}
//bt1.addActionListener의 매개변수를 위해 actionListener구현체 생성
class EventHandler implements ActionListener{
@Override
public void actionPerformed(ActionEvent e){
System.out.println("1번 버튼 눌림");
}
}