【发布时间】:2012-06-15 11:45:36
【问题描述】:
我对 java 比较陌生,我刚刚开始使用集合框架。
在ArrayList 上,我遇到了人们声明它的两种方式。例如声明ArrayList 的Strings :
List<String> l = new ArrayList<String>();
或
ArrayList<String> al = new ArrayList<String>();
我应该使用这两者中的哪一个,它们之间有什么区别?
我知道调用的实际方法是在运行时决定的,因此调用的方法都将属于 ArrayList 类,但第一个声明仍然限制了可以调用的方法。
我听说,第一种方法称为“对接口进行编码”。任何方法都将使用变量l 调用,因此只能调用List 接口提供的方法,而在第二个示例中,我们不仅可以调用List 提供的所有方法,还可以调用Object 提供的所有方法类也(如finalize()、wait() 等)。那么为什么人们甚至首先使用第一个声明呢?
【问题讨论】:
-
您仍然可以使用
l实例访问Object类方法。 -
@PrinceJohnWesley: 我怎么能因为
l是一个接口的引用并且接口不属于Object类的层次结构? -
每个对象都是
Object类型。List<T>是Object的子类型 -
但是
List是一个接口,我已经读到接口不属于类层次结构,那么如果它甚至不扩展它怎么能成为Object的子类型呢? ? -
重点是你仍然可以通过它们各自的类实现的接口之一来引用对象。因此,当您说“List l”时,您的意思是“实现 List 的某个类或其他类的对象”。然后你可以在'l'上调用接口List的任何方法。你也可以调用 Object 上的任何公共方法——因为你可以(Object 是一个特殊的类)。
标签: java collections