【问题标题】:Confusion over initialisation, instantiation and interface对初始化、实例化和接口的混淆
【发布时间】:2016-03-09 04:58:19
【问题描述】:

我是 Java 新手,正在尝试学习初始化的概念。我在网上看到这个说法:

List<Integer> numList  = Arrays.asList(1,2,3,4,5,6);

我知道接口类型不能被实例化。但是Arrays.asList() 方法返回一个实现List&lt;&gt; 接口的对象。这个语句算作初始化吗?我是否创建了一个实现List&lt;&gt; 接口的类的实例?

【问题讨论】:

  • @user2004685 当Arrays.asList() 返回ArrayList 时,额外的ArrayList&lt;&gt; 的目的是什么?
  • 是的,你是对的。对不起,我的错。
  • Arrays 有一个名为 java.util.Arrays$ArrayList 的内部类。它实现了接口List&lt;T&gt;Arrays.asList() 返回它的实例。
  • 实例化和初始化意味着不同的东西。实例化是当您使用new 创建对象时。初始化是在构造过程中分配对象的字段时,有时也用于局部变量的初始分配等。基本上(适合注释的内容),实例化=创建对象初始化=第一次分配一个变量。这些术语也可以在其他一些上下文中使用,但它们不可互换。

标签: java interface initialization


【解决方案1】:

是的,该语句算作初始化;您通过为其分配一个值来初始化numList 变量:Arrays.asList() 返回的值。

当调用Arrays.asList(arr) 时,它会根据输入数组arr 实例化一个ArrayListArrayList 是抽象类AbstractList 的具体实现,它本身实现了List。因此,虽然ArrayList 没有直接实现List 接口,但可以通过polymorphism将其视为一个。

更多详情请参考Java Tutorial on Creating ObjectsJava Tutorials on Interfaces,尤其是using an interface as a type部分。您还可以通过阅读有关 InheritanceInitializing Fields 的教程受益。

【讨论】:

    【解决方案2】:

    引用变量可以声明为类类型接口类型

    如果变量声明为接口类型,它可以引用任何实现该接口的类的任何对象。

    所以你已经创建了一个被接口变量引用的对象。

    【讨论】:

      【解决方案3】:
      • 这个语句算作初始化吗?

        是的。因为你初始化了引用变量numList

      • 我是否创建了一个实现 List 接口的类的实例?

        不,您没有创建实现 List 接口的类的实例。但是 Arrays.asList() 方法创建了类 ArrayList 的实例,将该对象的引用返回给您。

      如果您阅读源代码,您会发现如下内容:

      public static <T> List<T> asList(T... a) {
          return new ArrayList<>(a);
      }
      

      现在new ArrayList&lt;&gt;(a); 这个语句创建了一个实例。 是的ArrayList 实现List 接口。

      【讨论】:

      • 请不要误会我的意思,我可以投反对票,但是在我删除此答案之前,请有人纠正我。
      猜你喜欢
      • 2016-06-17
      • 1970-01-01
      • 2015-08-28
      • 1970-01-01
      • 1970-01-01
      • 2013-02-11
      • 1970-01-01
      • 2013-10-18
      • 1970-01-01
      相关资源
      最近更新 更多