我是Java新手。我无法理解anonymous class instance
和interface
之间的关系。请参阅this website中的示例:
// anonymous instance as a variable
Runnable r = new Runnable()
{
@Override
public void run()
{
//codes
}
};
Thread t1 = new Thread(r, "anonymous 1");
// anonymous instance as a parameter
Thread t2 = new Thread (new Runnable()
{
@Override
public void run()
{
//codes
}
}, "anonymous 2");
基于此SO问题(http://stackoverflow.com/questions/11069056/why-java-interface-can-be-instantiated-in-these-codes)中的答案,我对匿名有基本的了解类。
但是,我不明白这是什么:
Runnable r = new Runnable(){...};
在右侧,我们创建了一个匿名类的实例,因此它是object of a class
。在左侧,它是Interface
变量。
为什么可以将匿名类的实例分配给Interface变量?
请参阅此website:
Thread(Runnable target, String name)
似乎Thread期望第一个参数是一个接口变量。
答案 0 :(得分:3)
此代码......
Runnable r = new Runnable(){...};
类Runnable
是一个接口,所以你不能直接创建它的实例。但是,请注意{...}
部分中的代码 - 这是以本地化方式实现接口的方法。
基本上发生的事情是您正在创建接口的实例,该实例只能由定义r
的方法查看和使用。正如您在{...}
部分中实现了所有方法一样,该类是有效的,您可以像使用任何其他Runnable
对象一样使用它。
此代码......
Runnable r = new Runnable()
{
@Override
public void run()
{
//codes
}
};
实际上与执行以下操作相同......
public class MyRunnable implements Runnable {
public void run()
{
//codes
}
};
// This goes in your class where you want to create the Runnable object
Runnable r = new MyRunnable();
这两段代码都会创建一个r
实例的变量Runnable
。第一个解决方案是创建实例的简写,对于不需要在其他任何地方重用的东西很有用。第二个解决方案为实现接口创建了一个单独的类,它可以在本地范围之外重用。
我们能够使用接口类型存储变量,前提是分配给变量的对象实现接口。所以,在代码......
Runnable r = new Runnable(){...};
我们说r
实现了Runnable
接口。 {...}
中的位是接口实现的位置,如前所述,所以一切正常。
答案 1 :(得分:0)
只有在对象类实现该接口时,才能将对象分配给接口。在这种情况下,您将创建一个实现Runnable
接口的匿名类的对象,使其成为正确的赋值。
此外,Thread
班级有non-arg constructor。这就是代码编译的原因。