익명 클래스는 "확장"또는 "구현"을 어떻게 사용할 수 있습니까?


답변:


98

익명 클래스 다른 Java 클래스와 마찬가지로 확장하거나 구현 해야합니다java.lang.Object .

예를 들면 :

Runnable r = new Runnable() {
   public void run() { ... }
};

여기에 r를 구현하는 익명 클래스의 객체가 Runnable있습니다.

익명 클래스는 동일한 구문을 사용하여 다른 클래스를 확장 할 수 있습니다.

SomeClass x = new SomeClass() {
   ...
};

할 수없는 것은 둘 이상의 인터페이스를 구현하는 것입니다. 그렇게하려면 명명 된 클래스가 필요합니다. 그러나 익명 내부 클래스 나 명명 된 클래스는 둘 이상의 클래스를 확장 할 수 없습니다.


1
두 번째 표현이 옳지 않다고 생각합니다. 이미 클래스 이름을 SomeClass로 선언했습니다. 더 이상 익명이 아닙니다. 이 링크를 확인하십시오. docstore.mik.ua/orelly/java-ent/jnut/ch03_12.htm 인터페이스를 "새로 만들기"하면 "Object"클래스를 확장하고 해당 인터페이스를 구현하여 익명 클래스가 생성됩니다. 그러나 작성한 첫 번째 표현식으로 클래스를 "새로 만들기"하는 동안 해당 클래스를 확장하여 익명 클래스 (사실 익명 클래스의 인스턴스가 생성됨)가 생성됩니다.
lixiang

8
@youmiss : 두 번째 표현식은 SomeClass. 그것은 여전히 때문에 익명이다 {...}.
skaffman

1
나는 {...}을 간과했다.
lixiang

36

익명 클래스는 일반적으로 인터페이스를 구현합니다.

new Runnable() { // implements Runnable!
   public void run() {}
}

JFrame.addWindowListener( new WindowAdapter() { // extends  class
} );

2 개 이상의 인터페이스를 구현할 수 있는지 여부를 의미한다면 불가능하다고 생각합니다. 그런 다음 두 가지를 결합하는 개인 인터페이스를 만들 수 있습니다. 익명의 클래스가 왜 그것을 원하는지 쉽게 상상할 수는 없지만 :

 public class MyClass {
   private interface MyInterface extends Runnable, WindowListener { 
   }

   Runnable r = new MyInterface() {
    // your anonymous class which implements 2 interaces
   }

 }

anon 구현에서 2 개 이상의 인터페이스를 구현하려는 사람들에게 Google 친화적이기 때문에이 답변을 좋아합니다.
L. Holanda

16

익명 클래스는 항상 슈퍼 클래스 확장하거나 인터페이스를 구현합니다. 예를 들면 :

button.addActionListener(new ActionListener(){ // ActionListener is an interface
    public void actionPerformed(ActionEvent e){
    }
});

또한 익명 클래스는 여러 인터페이스를 구현할 수 없지만 다른 인터페이스를 확장하는 인터페이스를 만들고 익명 클래스가이를 구현하도록 할 수 있습니다.


11

아무도 그 질문을 이해하지 못한 것 같습니다. 이 사람이 원했던 것은 다음과 같았습니다.

return new (class implements MyInterface {
    @Override
    public void myInterfaceMethod() { /*do something*/ }
});

이것은 다중 인터페이스 구현과 같은 것을 허용하기 때문입니다.

return new (class implements MyInterface, AnotherInterface {
    @Override
    public void myInterfaceMethod() { /*do something*/ }

    @Override
    public void anotherInterfaceMethod() { /*do something*/ }
});

이것은 정말로 정말 좋을 것입니다. 하지만 Java에서는 허용되지 않습니다 .

수있는 일은 메서드 블록 내부에서 로컬 클래스를 사용하는 것입니다 .

public AnotherInterface createAnotherInterface() {
    class LocalClass implements MyInterface, AnotherInterface {
        @Override
        public void myInterfaceMethod() { /*do something*/ }

        @Override
        public void anotherInterfaceMethod() { /*do something*/ }
    }
    return new LocalClass();
}

정확히, 이것은 OP가 의도 한 것입니다 IMHO
DanielCuadra

질문에 대답하기 위해 엄지 손가락을 치십시오. 그래서 사람들은 요청 된 것이 아니라 무엇을 요청해야 하는지를 대답하기를 좋아합니다.
mfaisalhyder

3
// 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!"); }
    }
);

1

익명 클래스는 객체를 생성하는 동안 확장 또는 구현됩니다. 예 :

Interface in = new InterFace()
{

..............

}

여기서 익명 클래스는 인터페이스를 구현합니다.

Class cl = new Class(){

.................

}

여기서 익명 클래스는 추상 클래스를 확장합니다.


나는 차이를 보지 못합니다. 너의 것이 내 것과 어떻게 다른지.
trapedInBatcaveWithBAtman

내가 당신을 그리워 얼마나 좋은 컴팩트 한, 대답은 "항상"또는 "필수": 같은 단어입니다
kiedysktos
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.