익명 클래스는 특이하게도 다른 내부 클래스들과 달리 이름이 없다. 클래스의 선언과 객체의 생성을 동시에 하기 때문에 단 한번만 사용될 수 있고 오직 하나이 객체만을 생성할 수 있는 일회용 클래스이다.
new 조상클래스이름() {
// 멤버 선언
}
또는
new 구현인터페이스이름() {
// 멤버 선언
}
이름이 없기 때문에 생성자도 가질 수 없으며, 조상클래스의 이름이나 구현하고자 하는 인터페이스의 이름을 사용해서 정희하기 때문에 하나의 클래스로 상속받는 동시에 인터페이스를 구현하거나 둘 이상의 인터페이스를 구현할 수 없다. 오로지 단 하나의 클래스를 상속받거나 단 하나의 인터페이스만을 구현할 수 있다.
익명 클래스의 방법 예제
public class Java_bible {
// 익명 클래스
Object iv = new Object() {
void method() {
}
};
// 익명 클래스
static Object cv = new Object() {
void method() {
}
};
// 익명 클래스
void myMethod() {
Object lv = new Object() {
void method() {
}
};
}
}
Bird 클래스의 자식 클래스를 Eagle이라는 이름의 중첩 클래스로 정의해서 사용하는 예제이다.
package sec06;
public class Bird { // Class의 예
void move() {
System.out.println("새가 움직인다~~~~");
}
}
//public interface Bird { // Interface 의 예
// void move();
//}
package sec06;
public class MemberDemo {
// Member class 지점
class Eagle extends Bird {
@Override
public void move() { // Bird 클래스의 move()를 오버라이딩 한 메서드.
System.out.println("독수리가 난다~~~");
}
public void sound() { // Eagle class에 추가한 메서드.
System.out.println("휘익~~~~");
}
} // Member class 끝나는 지점
// MemberDemo 클래스의 멤버 필드.
Eagle e = new Eagle();
public static void main(String[] args) {
MemberDemo m = new MemberDemo();
// MemberDemo 클래스의 객체인 m의 멤버필드 e 객체의 move()와
// sound() 메서드를 호출한다
m.e.move();
m.e.sound();
}
}
package sec06;
public class Bird {
void move() {
System.out.println("새가 움직인다~~~~");
}
}
package sec06;
public class Anonymous1Demo {
// Anonymous1Demo 클래스의 멤버 필드이다.
Bird eagle = new Bird() {
// Bird 클래스의 move() 메서드를 오버라이딩한다.
public void move() {
System.out.println("독수리가 난다~~~");
}
// Bird 타입에 없는 메서드이므로 Bird 타입의 객체로는 접근할 수 없다.
void sound() {
System.out.println("휘익~~~");
}
};
public static void main(String[] args) {
Anonymous1Demo anonymous1Demo = new Anonymous1Demo();
anonymous1Demo.eagle.move(); // 다형성으로 오버라이딩한 메서드를 호출한다.
// anonymous1Demo.eagle.sound(); // a.e 객체가 Bird타입이므로 sound() 메서드를 호출할 수 없다.
}
}
package sec06;
public class LocalDemo {
public static void main(String[] args) {
// **기명 지역 클래스**
class Eagle extends Bird {
public void move() {
System.out.println("독수리가 난다~~~");
}
}
Bird eBird = new Eagle();
eBird.move();
// **익명 지역 클래스**
Bird bEagle = new Bird() {
public void move() {
System.out.println("독수리는 난다!!!");
}
};
bEagle.move();
// **일회용 익명 지역 클래스**
// 참조변수를 부여하지 않고 일회용으로 사용 하는 응용법.
new Bird() {
public void move() {
System.out.println("독수리는 난다날아!!!");
}
}.move();
}
}
package sec06;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class AnonymousComparator {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("Nope Hi");
list.add("Hi");
list.add("Nope");
Comparator<String> cmp = new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.length() - o2.length();
}
};
Collections.sort(list, cmp);
System.out.println(list);
}
}
다른 예제
// 더 간단하게 이용 가능.
public class Java_bible {
public static void main(String[] args) {
Button b = new Button("Start");
b.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("ActionEvent occured!!!");
}
});
}
}