【问题标题】:Why an instance of anonymous class can be assigned to an Interface variable?为什么可以将匿名类的实例分配给接口变量?
【发布时间】:2012-06-17 06:30:03
【问题描述】:

我是 Java 新手。我很难理解anonymous class instanceinterface 之间的关系。参考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 变量。

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

参考这个website

Thread(Runnable target, String name)

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

【问题讨论】:

    标签: java interface instantiation anonymous-class


    【解决方案1】:

    这段代码...

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

    【讨论】:

    • 这是否意味着我正在创建一个匿名类型?
    【解决方案2】:

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

    另外,Thread 类有一个non-arg constructor。这就是代码编译的原因。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多