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


Answers:


98

匿名类必须像其他Java类一样扩展或实现某些东西,即使它只是just 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 2012年

8
@youmiss:第二个表达式将创建一个extends匿名类的实例SomeClass。由于,它仍然是匿名的{...}
skaffman'5

1
我知道,我忽略了{...}。
lixiang 2012年

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个或更多接口的人们非常友好。
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()
{

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

}

在这里,匿名类正在实现Interface。

Class cl = new Class(){

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

}

在这里,匿名类扩展了抽象类。


我看不出有什么区别。你和我的有何不同。
trapdInBatcaveWithBAtman

一个不错的紧凑型
笔记本电脑
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.