2017-04-18 137 views
2

我非常新的Java和我想知道这实际上意味着:什么是“列表<Integer> list = new ArrayList <Integer>();”其实是什么意思?

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

,以区分各个这个问题,我读过有关多态性与例1和2的区别的帖子,我也明白例1允许“编程接口”。我也明白,使用示例1,可以轻松地将列表更改为LinkedList,而不会影响其余的代码。

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

但是我想知道例1实际意味着什么。它是否创建一个新的列表?或者它创建一个新的ArrayList?结果对象是否具有List的属性?或者结果对象是否具有ArrayList的属性?我是否可以实现ArrayList在列表中使用的方法,而不会出现编译错误?

这是我第一次发布问题,所以请让我知道,如果我可以做任何改进。

+0

首先,ArrayList的是具体的List实现,exampl1创建ArrayList类型(具体实现)的一个新的列表。变量“list”具有ArrayList的属性/方法。 – imprezzeb

+0

[可能重复](http:// stackoverflow。com/questions/14903145/list-and-arraylist之间的区别是什么) – gks

+1

[类型列表与Java中的类型ArrayList]可能的重复(http://stackoverflow.com/questions/2279030/type- list-vs-type-arraylist-in-java) – ZhekaKozlov

回答

2

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

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

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

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

您的问题:

但我想知道什么是例1实际上意味着什么。它是否创建 一个新的列表?或者它创建一个新的ArrayList?

它创建一个新的ArrayList

是否生成的对象有一个列表的属性?还是 生成的对象具有ArrayList的属性?

所得对象具有所有的ArrayList的属性。

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

但是你可以使用型铸造访问ArrayList这样的方法,如果你以后需要(但如ArrayList中没有什么理由远远超出在列表什么)

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

谢谢你的回答!提及“类型转换”确实说明了你的答案,这正是我需要听到的。 –

0

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

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

关于你的问题:

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

你的第二个示例声明的ArrayList并初始化它作为一个ArrayList,这意味着你现在有机会来调用ArrayList类的方法,如ArrayList#ensureCapacityArrayList#trimToSize

1

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

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

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

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); 
-1

它不属于java的,它是属于OOP:当你将一些超类型或接口的变量的引用

没有实际发生的对象。您将只能调用对该变量上的该声明类型可见的方法。

请记住,任何类实现一个接口,必须实现这一切是方法