익명 클래스가 수퍼 클래스를 확장하거나 인터페이스를 구현하는 방법은 무엇입니까?익명 클래스가 "extends"또는 "implements"를 어떻게 사용할 수 있습니까?
답변
익명 클래스 은 다른 Java 클래스와 마찬가지로 java.lang.Object
인데도 확장하거나 구현해야합니다. 예를 들어
: 여기
Runnable r = new Runnable() {
public void run() { ... }
};
, r
는 Runnable
구현 익명 클래스의 오브젝트이다.
익명의 클래스는 동일한 구문을 사용하여 다른 클래스를 확장 할 수 있습니다 : 당신이 할 수없는 것은 하나 이상의 인터페이스를 구현하는 것입니다
SomeClass x = new SomeClass() {
...
};
. 이름을 지정하는 클래스가 필요합니다. 그러나 익명의 내부 클래스 나 명명 된 클래스는 둘 이상의 클래스를 확장 할 수 없습니다. 당신은 내가 그 불가능이 생각하는 것보다, 이상의 인터페이스를 구현할 수 있는지 여부를
new Runnable() { // implements Runnable!
public void run() {}
}
JFrame.addWindowListener(new WindowAdapter() { // extends class
});
을 의미하는 경우 :
두 번째 표현이 정확하다고 생각하지 않습니다. 이미 클래스 이름을 SomeClass로 선언 했으므로 더 이상 익명이 아닙니다. http://docstore.mik.ua/orelly/java-ent/jnut/ch03_12.htm 인터페이스를 "새로"만들면 "Object"클래스를 확장하고 해당 인터페이스를 구현하여 익명 클래스를 만듭니다. 그러나 당신이 작성한 첫 번째 표현식을 가진 클래스를 "새롭게하는"동안, 익명 클래스 (사실 익명 클래스가 생성 된 인스턴스 임)는 해당 클래스를 확장하여 생성됩니다. – lixiang
@youmiss : 두 번째 표현식은 'SomeClass'를 확장하는 익명 클래스의 인스턴스를 생성합니다. '{...} '때문에 여전히 익명입니다. – skaffman
나는 {...}을 간과했다. – lixiang
익명의 클래스는 일반적으로 인터페이스를 구현합니다. 그런 다음 둘을 결합한 개인 인터페이스를 만들 수 있습니다. 당신이 원하는 왜 내가 쉽게 상상할 수 없지만 익명 클래스는이합니다 :
public class MyClass {
private interface MyInterface extends Runnable, WindowListener {
}
Runnable r = new MyInterface() {
// your anonymous class which implements 2 interaces
}
}
익명 클래스 항상는 슈퍼 클래스를 확장하거나 인터페이스를 구현합니다. 예를 들어 : 익명 클래스는 여러 인터페이스를 구현할 수 있지만
button.addActionListener(new ActionListener(){ // ActionListener is an interface
public void actionPerformed(ActionEvent e){
}
});
는 또한, 다른 인터페이스를 확장하는 인터페이스를 작성하고 익명 클래스를 구현하도록 할 수 있습니다.
// The interface
interface Blah {
void something();
}
...
// Something that expects an object implementing that interface
void chewOnIt(Blah b) {
b.something();
}
...
// Let's provide an object of an anonymous class
chewOnIt(
new Blah() {
@Override
void something() { System.out.println("Anonymous something!"); }
}
);
익명 클래스 연장하거나 예를 들어 그 오브젝트 생성시 실행된다
Interface in = new InterFace()
{
..............
}
여기 익명 클래스 인터페이스를 구현한다.
Class cl = new Class(){
.................
}
여기 익명의 클래스는 추상 클래스를 확장하고 있습니다.
차이가 보이지 않습니다.네가 어떻게 다른지 내거야. – trapedInBatcaveWithBAtman
예. 다른 클래스와 마찬가지로 할 수 있습니다. –
불행히도 그렇지 않은 경우 생성자를 표시해야합니다. –