java - 为什么可以将匿名类的实例分配给接口(interface)变量?

标签 java interface instantiation anonymous-class

我是 Java 新手。我无法理解匿名类实例接口(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");

根据这个问题(http://stackoverflow.com/questions/11069056/why-java-interface-can-be-instantiated-in-these-codes)中的答案,我对匿名有了基本的了解类。

但是,我不明白这是什么:

Runnable r = new Runnable(){...};

在右侧,我们创建了一个匿名类的实例,因此它是一个类的对象。在左侧,它是一个Interface 变量。

为什么可以将匿名类的实例分配给接口(interface)变量?

引用这个website :

Thread(Runnable target, String name)

线程似乎期望第一个参数是接口(interface)变量。

最佳答案

这段代码...

Runnable r = new Runnable(){...};

Runnable是一个接口(interface),所以你不能直接创建它的实例,这是正确的。但是,请注意 {...} 部分中的代码 - 这是以本地化方式实现接口(interface)的方法。

基本上,您正在创建一个接口(interface)实例,该实例只能通过定义 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实例。第一个解决方案是创建实例的简写,对于不需要在其他地方重用的东西很有用。第二种解决方案创建一个单独的类来实现接口(interface),并且可以在本地范围之外重用它。

只要分配给变量的对象实现该接口(interface),我们就可以存储具有接口(interface)类型的变量。所以,在代码中...

Runnable r = new Runnable(){...};

我们说的是 r 实现了 Runnable 接口(interface)。如前所述,{...} 中的位是实现接口(interface)的位置,因此一切正常。

关于java - 为什么可以将匿名类的实例分配给接口(interface)变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11069371/

相关文章:

java - 从另一个 fragment 导航后返回时 ViewPager 不可见

c# - 微软视觉 C# : Eclipse-style autocomplete for interface methods

android - 跨多个 fragment 重用回调接口(interface)

java - 在其他 Java 类的构造函数中使用枚举

java - 导入库时出现 HoloEverywhere 错误 - Android

java - 如果我们有 @Override 为什么没有 @Implementation 或 @Implements`?

C++ unique_ptr 单独声明和实例化

java - 为什么可以实例化 String 而不能实例化 Number(Long,Double,Integer...)?

c# - 如何实例化一个大的不可变类型?

java - 初始化 FingerpringManager.Crypto 对象,获取不受 AndroidKeyStore 提供程序支持的 Crypto 原语?