我是 Java 的新手,我想知道这到底意味着什么:
List<Integer> list = new ArrayList<Integer>(); //Example 1
为了将这个问题与其他问题区分开来,我阅读了有关多态性以及示例 1 和示例 2 之间的区别的帖子,并且我了解到示例 1 允许“编程接口”。我还了解到,在示例 1 中,可以轻松地将列表更改为 LinkedList,而不会影响其余代码。
ArrayList<Integer> list = new ArrayList<Integer>(); //Example 2
但我想知道示例 1 的实际含义。它会创建一个新列表吗?还是创建一个新的 ArrayList?结果对象是否具有列表的属性?或者生成的对象是否具有 ArrayList 的属性?我可以在没有编译错误的情况下实现 ArrayList 在列表上使用的方法吗?
这是我第一次发布问题,所以如果我可以做任何改进,请告诉我。
原文由 Caroline Yi 发布,翻译遵循 CC BY-SA 4.0 许可协议
在您的两个示例中,只有表达式
new
创建对象实例(=
的右侧),左侧仅定义一个指向您的对象的变量创建。在这两种情况下,您创建的对象都是类型
ArrayList
。List
是接口,不是类,接口本身不能实例化。 ButArrayList
implements the interfaceList
, so you can assign an instance ofArrayList
to a variable of typeList
.示例 1 的优点是您可以稍后决定创建
List
的另一个实现(如LinkedList
)以及使用List
类型的所有代码变量仍然可以正常工作而无需任何更改。而在示例 2 中,如果您稍后决定需要不同类型的List
,则需要更改指向实际对象的所有变量的类型。你的问题:
它创建一个新的
ArrayList
。生成的对象 具有
ArrayList
的所有属性。但是,通过类型为 --- 的变量
list
List
,你只能访问接口中定义的方法List
。但是你可以使用 类型转换 来访问
ArrayList
中的方法,如果你以后需要的话(但是没有什么理由因为 ArrayList 没有超出 List 中的内容)