匿名类如何使用“扩展”或“实现”?

时间:2011-05-01 13:03:06

标签: java anonymous-class

匿名类如何扩展超类或实现接口?

6 个答案:

答案 0 :(得分:91)

匿名类必须扩展或实现某些东西,就像任何其他Java类一样,即使它只是java.lang.Object

例如:

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

此处,r是实现Runnable的匿名类的对象。

匿名类可以使用相同的语法扩展另一个类:

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

您不能做的是实现多个界面。你需要一个命名类来做到这一点。但是,匿名内部类和命名类都不能扩展多个类。

答案 1 :(得分:33)

匿名类通常实现一个接口:

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
   }

 }

答案 2 :(得分:15)

匿名类始终扩展超类或实现接口。例如:

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

此外,尽管匿名类无法实现多个接口,但您可以创建一个扩展其他接口的接口,并让您的匿名类来实现它。

答案 3 :(得分: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!"); }
    }
);

答案 4 :(得分:2)

我猜没有人理解这个问题。我想这个家伙想要的是这样的:

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不允许的

可以做的操作是在方法块内使用local classes

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

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

答案 5 :(得分:1)

匿名类在创建其对象时正在扩展或实现 例如:

Interface in = new InterFace()
{

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

}

这里匿名类正在实现Interface。

Class cl = new Class(){

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

}

这里匿名类正在扩展一个抽象类。