9

我已经读过Java接口不能被实例化(在文档中,接口)。Runnable,顾名思义是一个应该由某个类实现的接口。但是在我的一个 Android 应用程序的以下代码中,我看到一个空的构造函数 - Runnable()...(我不确定它是否是一个构造函数),并且已经创建了一个实例 - getStatus。

final Runnable getStatus = new Runnable()
{
    public void run()
    {
        TextView uat = (TextView) findViewById(R.id.useAndThrow);
        uat.setText(MyThread.getStatus());
        return;
    }
};

我所知道的:

  1. 这可能是匿名类的一个例子。
  2. 该实例实际上不是接口。

但我无法连接这些点。假设上面的代码在 myActivity 类中,实例化了什么,这个匿名类又是怎样的呢?

有点细节会很棒。

4

4 回答 4

7

它被称为“匿名类”。关于它的一些注释:

  1. 您没有为它提供名称,因此为您创建了一个。要查看它的真实名称,只需将其写入控制台或读取字节码即可。

  2. 匿名类,如果在外部类的范围内创建,它具有对其字段的引用,就像任何内部类一样。通常,它具有与创建位置相同的范围。

  3. 如果您只需要一个简单的实现,这是一件很常见的事情。代码越多,您越应该考虑将其放在另一个文件中(为了订单,而不是因为您不能)。

  4. Runnable 不是唯一常见的接口。在 Android 上,您使用 OnClickListener、OnTouchListener、...

  5. 由于匿名类与声明它的位置具有相同的范围,这意味着它具有引用。尽量不要将匿名类保留太久(例如,在静态引用中),因为这可能导致内存泄漏。在 Android 上,这一点非常重要,正如这个示例所示(谈论可绘制对象,但匿名类也可以引用上下文)。

  6. 匿名类的一些缺点是它们没有构造函数,并且它不能实现多个接口。它的使用范围很窄,但很受欢迎,因为它非常易于使用(和阅读)。

于 2012-06-15T14:17:17.960 回答
2

谷歌使用“匿名内部类”获取更多信息。这篇“Java 中的内部类,其中的奥秘”博文很好地解释了不同类型的内部类。另见“3.12. 匿名类”

于 2012-06-15T14:11:42.250 回答
1

正在实例化的是Runnable. 它之所以称为匿名,是因为该类型本身没有名称。在这个子类中,您正在实现接口run()中指定的方法。Runnable

的类型getStatusRunnable,但是被引用的对象getStatus实际上是一个Runnable没有显式命名类型的实现。

于 2012-06-15T14:04:54.577 回答
0

该代码正在创建一个实现 Runnable 接口的类的实例。该类没有名称。

于 2012-06-15T14:19:26.080 回答