什么&#34; List <integer> list = new ArrayList <integer>(); &#34;实际上是什么意思?

时间:2017-04-18 02:05:19

标签: java list arraylist

我对Java很陌生,我想知道这实际意味着什么:

List<Integer> list = new ArrayList<Integer>(); //Example 1

为了将这个问题与其他问题区分开来,我已经阅读了有关多态性的帖子以及示例1和示例2之间的区别,并且我理解示例1允许编程接口。&#34;我也理解,通过示例1,可以轻松地将列表更改为LinkedList,而不会影响其余代码。

ArrayList<Integer> list = new ArrayList<Integer>(); //Example 2

但我想知道示例1的实际含义。它会创建一个新列表吗?或者它是否创建了一个新的ArrayList?结果对象是否具有List的属性?或者结果对象是否具有ArrayList的属性?我可以实现ArrayList在列表上使用的方法而不会出现编译错误吗?

这是我第一次发帖提问,所以如果我能做任何改进,请告诉我。

6 个答案:

答案 0 :(得分:5)

在两个示例中,只有表达式new创建对象的实例(=的右侧),左侧只定义一个指向您创建的对象的变量

在这两种情况下,您创建的对象都是ArrayList类型。

List是一个接口,而不是一个类,接口本身无法实例化。但是ArrayList 实现接口List,因此您可以将ArrayList的实例分配给List类型的变量。

示例1的优点是,您以后可以决定创建List的另一个实现(如LinkedList),并且所有使用List类型的代码仍然会变量工作没有任何改变。在示例2中,如果您稍后决定需要不同类型的List,则需要更改指向实际对象的所有变量的类型。

您的问题:

  

但我想知道示例1的实际含义。它创造了吗?   新名单?或者它是否创建了一个新的ArrayList?

它会创建一个新的ArrayList

  

结果对象是否具有List的属性?或者是   结果对象具有ArrayList的属性?

生成的对象具有 ArrayList的所有属性。

但是,通过类型为list的变量List,您只能访问接口List中定义的方法。

但是你可以使用 type-casting 来访问ArrayList这样的方法,如果你以后需要的话(但是没有什么理由因为ArrayList没有太多的东西超出了在列表中)

List<Integer> list = new ArrayList<Integer>(); //Example 1
ArrayList<Integer> arrayList = (ArrayList<Integer>) list; // type-cast

答案 1 :(得分:1)

您可能已经知道,List是一个接口,ArrayList是一个类。这意味着List更通用,而ArrayList更具体。

在示例1中,您无法调用ArrayList支持的其他方法,例如你不能调用ensureCapacity,因为它是在Arraylist类中实现的。

与示例2不同,您可以调用ArrayList支持的所有功能。使用示例1的好处是在实现改变的情况下增加灵活性并最小化代码改变,例如,将来你决定使用LinkedList。您无需担心对使用了list变量的所有行进行任何更改。

答案 2 :(得分:0)

通常首选从其实现的接口声明变量,但是根据您使用的接口或抽象类,您可能会失去对某些方法的访问权。

基本上,它可以让您的程序变得更加灵活。

关于你的问题:

您的第一个示例声明List并将其初始化为ArrayList。您只能从List接口及其父类/接口调用方法。

您的第二个示例声明ArrayList并将其初始化为ArrayList,这意味着您现在可以访问ArrayList类中的调用方法,例如ArrayList#ensureCapacity或{ {1}}。

答案 3 :(得分:0)

假设您有一个接收List对象作为参数的方法。

public void myMethod(List<Integer> myList) { ... }

通过使用示例1,您可以灵活地将List接口的不同实现传递给此方法,而无需任何类型的转换。

List<Integer> list1 = new ArrayList<Integer>();
List<Integer> list2 = new LinkedList<Integer>();
myMethod(list1);
myMethod(list2);

答案 4 :(得分:0)

List 是接口,ArrayList 是 List 接口的具体实现。

如果你熟悉多态的概念,如果不是那么可以参考Java Interface (w3schools),或者只是记住任何实现接口的类,必须覆盖它的所有抽象方法,以便类获得它的所有方法。

您的 List 变量将获得 add() 方法并且这些 < > 比较括号被指定为“我要添加的列表的对象” .

答案 5 :(得分:-1)

它不属于java,属于OOP:

当您将对它的引用分配给某个超类型或接口的变量时,该对象实际上没有发生任何事情。您只能在变量上调用对该声明类型可见的方法。

请记住,任何类实现接口都必须实现所有方法