为什么我可以在不声明类的情况下实例化接口?

时间:2016-05-23 19:09:05

标签: java android interface

因此在Java中,可以在不创建显式类

的情况下实例化接口
public interface Foo {
  public void OnNotify()
}

说我在其他地方做了以下事情,比如说方法订阅

public void Subscribe()
{
  final int someInt = 5;

  Foo bar = new Foo() {
    final int value = someInt;

    @Override
    public void OnNotify()
    {
        Log.d("Debug", "You are being notified that I hold the value " + value);
    }
  }

  someObject.AddSubscription(bar);
}

这在Android中广泛用于设置事件的侦听器。

为什么这是可能的,这种实例化是否有一个特殊的名称?这可能在某种程度上与lambda函数有关吗?

如果我想将它提供给这个实例化的接口来保存,为什么我需要创建一个'final'变量。比方说,我想传递for循环的当前迭代'i'来识别订阅引用的数组的索引。我需要声明一个最终变量来保存'i',然后将它传递给实例化的接口。

编辑: 我仍然在问为什么我可以在不先创建类的情况下实例化接口,以及它的名称。不知道这是什么,我无法找到重复的问题,这不包括Java匿名类的内容。

1 个答案:

答案 0 :(得分:0)

  

为什么这是可能的,这种实例化是否有一个特殊的名称?这可能在某种程度上与lambda函数有关吗?

  1. 我不知道任何"特殊名称"为了这。我通常将其称为"接口实现声明。"但这只是我,也许这不准确或正确。
  2. 我相信它们不是,因为除了语法差异之外,我将lambdas视为类似于方法类的结构,并且这种形式是从对象类型覆盖方法。传递接口对象时,您要传递类型的引用。
  3.   

    为什么我需要做一个' final'变量,如果我想将它提供给这个实例化的接口来保存。

    我看待它并理解它的方式是因为这个声明内联而不是单独的类并没有完全改变接口仍然是什么。 In the Java programming language, an interface is a reference type, similar to a class, that can contain only constants, method signatures, default methods, static methods, and nested types Link

    接口需要有一个常量,对我而言final是一个与C / C ++关键字const类似的关键字,因为它不是保留值而是{a}引用您声明的类型。这些值是不可变的,可以防止任何副本和更改,因为它们只包含对值的位置的引用。

    所以,总的来说,我认为像你所说明的接口声明不能用于声明实际接口类的实例,而是它创建了该类型的对象,并且该对象是一个新位置在内存中保存对这些方法和成员(如类)的引用。

    希望这会有所帮助。我通常不喜欢自愿回答我不是100%肯定的事情的答案,并希望这是一个更多的评论(但仍然缺乏代表),但希望它有助于清除一些事情。

    您也可以阅读Java语言规范here以获取有关接口的更多信息。希望有所帮助。