我对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在列表上使用的方法而不会出现编译错误吗?
这是我第一次发帖提问,所以如果我能做任何改进,请告诉我。
答案 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:
当您将对它的引用分配给某个超类型或接口的变量时,该对象实际上没有发生任何事情。您只能在变量上调用对该声明类型可见的方法。
请记住,任何类实现接口都必须实现所有方法