따로 명시적으로 선언하지 않고 일회용 객체를 만들 수 있다. 익명 객체는 주로 필드 값, 로컬 변수 값, 매개변수 값으로 사용된다. 클래스를 상속하거나 인터페이스를 implements 해서 생성할 수 있다.
부모 클래스를 상속해서 생성하는 익명 객체
new 부모클래스생성자(...) { ... }
중괄호 블록에서는 주로 부모 클래스의 메서드를 Override 한다. 부모 클래스의 멤버만 익명 객체의 멤버에 접근할 수 있다.
/* CPU.java */
public class CPU {
public void powerOn() {
System.out.println("CPU ON");
}
}
/* Desktop.java */
public class Desktop {
/* 1. 익명 자식 클래스를 필드에 대입하고 메서드 정의 */
private CPU cpu = new CPU() {
@Override
public void powerOn() {
System.out.println("Apple CPU ON");
}
}
public void start1() {
cpu.powerOn();
}
/* 2. 익명 자식 클래스를 메서드 속 로컬변수에 대입 */
public void start2() {
CPU cpu = new CPU() {
@Override
public void powerOn() {
System.out.println("Intel CPU ON");
}
}
cpu.powerOn();
}
/* 3. 익명 자식 클래스를 매개변수로 받기 */
public void start3(CPU cpu) {
cpu.powerOn();
}
}
/* 실행 */
Desktop mypc = new Desktop();
mypc.start1();
mypc.start2();
mypc.start3(new CPU() {
@Override
public void start() {
System.out.println("AMD CPU ON");
}
}); // 매개변수로 익명 객체를 전달
powerOn 메서드를 재정의한 후, 필드 cpu 에 대입된다. start1 메서드는 이 cpu 필드를 이용해, 재정의된 powerOn 메서드를 호출한다. start2 메서드 선언 시 익명객체를 생성해서 로컬변수 cpu 에 대입하고, 이를 활용해서 재정의된 powerOn 메서드를 호출한다.start3 메서드는 이 메서드를 사용하는 곳 에서 익명 객체를 생성해서 매개변수로써 전달된다. 이 익명객체는 자동 타입 변환되어 cpu 매개변수에 대입되고, 재정의된 powerOn 메서드를 호출한다./* CPU.java */
public interface CPU {
void powerOn(); // 추상 메서드
}
/* Desktop.java */
public class Desktop {
/* 1. 필드에 익명 구현 클래스 대입 */
private CPU cpu = new CPU() {
@Override
public void powerOn() { ... }
}
public void start1() {
cpu.powerOn();
}
/* 2. 메서드 속 로컬 변수에 대입 */
public void start2() {
CPU cpu = new CPU() {
@Override
public void powerOn() { ... }
}
}
/* 3. 매개변수로 익명구현클래스 받기 */
public void start3(CPU cpu) {
cpu.powerOn();
}
}
/* 실행 */
Desktop mypc = new Desktop();
mypc.start1();
mypc.start2();
mypc.start3(new CPU() {
@Overrride
public void powerOn() { ... }
});