1

可能重复:
List 与 ArrayList 作为引用类型?

声明 List l = new ArrayList() 和 ArrayList al = new ArrayList() 有什么区别

4

3 回答 3

7

声明List l = new ArrayList()l 时仅限于接口 List 提供的方法,而声明 l 时ArrayList al = new ArrayList()可以使用 arraylist 中的所有方法和字段。

当您声明它时List l,您可以为自己提供更大的灵活性,因为如果您想在不破坏任何代码的情况下,您可以在以后将 ArrayList 更改为更合适的东西。

编辑

正如 Chin Boon 指出的那样,您可以强制l转换为 ArrayList,从而在其上使用 ArrayLists 的方法。但是,通常如果您发现自己依赖于 ArrayList 的特定方面,那么对接口(List)进行编程就没有什么意义了。

于 2012-10-09T03:30:32.360 回答
3

List是一个Interface(ArrayList 的超类型,LinkedList)。当您坐着时,List l = new ArrayList(); 您正在创建一个具有超类引用的子类对象,因此您只能访问超类的方法,但如果方法被覆盖,则将调用子类方法。

在你的情况下:

List l = new ArrayList()

您将只能调用在列表接口内声明的方法和字段。

ArrayList al = new ArrayList()

您将能够从列表和数组列表中调用方法和字段。

当您使用方法 1 创建数组列表时

List l = new ArrayList();

稍后您可以使用相同的引用来创建一个 LinkedList

l = new LinkedList();

你不能使用方法2:

ArrayList al = new ArrayList()

al = new LinkedList()// cannot do this
于 2012-10-09T03:31:27.240 回答
0

将变量声明为 List 类型可以准确地告诉编译器它将允许您使用该变量做什么。在这种情况下,您可以执行 List 接口定义的所有操作。由于 ArrayList 实现了 List,您当然可以将 ArrayList 分配给您的 List 变量,但您只能访问 List 接口中定义的内容,即使 ArrayList 定义了 List 接口指定之外的其他方法。另一方面,将类型声明为 ArrayList 可以让您执行 ArrayList 类定义的任何操作,即使它不是由 List 类型定义的。但是,如果您想稍后将变量重新分配给其他类型的列表,您将无法这样做,因为编译器的类型检查器将需要 ArrayList。

于 2012-10-09T03:34:47.253 回答