繁体   English   中英

为什么可以将匿名类的实例分配给Interface变量?

[英]Why an instance of anonymous class can be assigned to an Interface variable?

我是Java新手。 我有理解anonymous class instanceinterface之间的关系。 请参阅本网站中的示例:

// 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 classobject of a class 在左侧,它是一个Interface变量。

为什么可以将匿名类的实例分配给Interface变量?

参考这个网站

Thread(Runnable target, String name)

似乎Thread期望第一个参数是一个Interface变量。

这段代码......

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接口。 {...}的位是接口的实现位置,如前所述,所以一切正常。

仅当对象类实现该接口时,才能将对象分配给接口。 在这种情况下,您将创建一个实现Runnable接口的匿名类的对象,使其成为正确的赋值。

此外, Thread类具有非arg构造函数 这就是代码编译的原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM