“List<Integer> list = new ArrayList<Integer>(); ”到底是什么意思?

新手上路,请多包涵

我是 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 许可协议

阅读 1.2k
2 个回答

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

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

List 是接口,不是类,接口本身不能实例化。 But ArrayList implements the interface List , so you can assign an instance of ArrayList to a variable of type List .

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

你的问题:

但我想知道示例 1 的实际含义。它会创建一个新列表吗?还是创建一个新的 ArrayList?

它创建一个新的 ArrayList

结果对象是否具有列表的属性?或者生成的对象是否具有 ArrayList 的属性?

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

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

但是你可以使用 类型转换 来访问 ArrayList 中的方法,如果你以后需要的话(但是没有什么理由因为 ArrayList 没有超出 List 中的内容)

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

原文由 Erwin Bolwidt 发布,翻译遵循 CC BY-SA 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);

原文由 alayor 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题