任何人都可以解释一下,使用对象创建引用名称或使用接口有什么区别。
例1
ArrayList li=new ArrayList();// creating reference using class name
例2
List li=new ArrayList()//creating reference using interface name
在真实场景中,为什么开发人员使用 ex2?
使用 ex2 有什么好处?
第二种方法是对接口进行编程。它清楚地表明,尽管您可能依赖于所选实现行为的某些方面(例如其性能特征或排序顺序等),但您仅依赖于接口中声明的成员。这通常使以后更容易将一个实现换成另一个实现。
(如果你依赖于实现的某些非常具体的方面,我发现明确说明通常是一个好主意,以避免以后出现意外。
这意味着您正在为合约而不是实现编码。在您的示例中,列表联系人。如果以后您需要不同类型的列表,您需要做的就是更改您进行声明的一行。它使将来进行更改变得更加容易。
如果您需要 ArrayList 上不在列表中的特定方法,则使用 ex1 是有效的。尽管如果您从 ArrayList 更改,可能会更难。此链接可能对 http://jdevelopment.nl/java-best-practices-5-code-to-interface-access-by-name-and-instance-data/有用
第二个有更多的优点:
在Set 类型的变量中存储对HashSet
或TreeSet
的引用被认为是一种很好的样式。例如:
Set<String> names = new HashSet<String>();
这样,如果您决定改用树集,则只需更改一行。
此外,对集合进行操作的方法应指定 Set 类型的参数:
public static void print(Set<String> s)
然后,该方法可用于所有集合实现。