试图理解在 Java 中声明对象的不同方式? [复制]

Posted

技术标签:

【中文标题】试图理解在 Java 中声明对象的不同方式? [复制]【英文标题】:Trying to understand different ways of declaring an object in Java? [duplicate] 【发布时间】:2014-05-25 13:46:27 【问题描述】:

我正在尝试了解以下 2 行代码之间的区别。

我知道一个是引用类型List 而另一个是引用类型ArrayList 是有原因的。但这真的很重要,还是只是做同一件事的两种不同方式?

它不仅适用于这些类/接口,也适用于其他类/接口。我相信这是一个具有不同形式的对象的多态性特征,对吗?

List a1 = new ArrayList();
ArrayList a1 = new ArrayList();

【问题讨论】:

【参考方案1】:

它确实与继承/多态性有关。认为它类似于:

Animal dog1 = new Dog();
Dog dog2 = new Dog();

两者都可能让你.eat(),但只有dog2可以.bark()

【讨论】:

【参考方案2】:

List 是一个接口,ArrayList 实现了该接口。

List a1 = new ArrayList();

a1 将是一个包含对象 ArrayList 实例的 List 变量,新的 ArrayList 到 List 的转换将隐式完成。

【讨论】:

【参考方案3】:

你不声明对象,你声明变量(和成员)。

界面你对对象的区别。在第一种情况下,接口是List,而在第二种情况下是ArrayList。底层对象是相同的,但您对它有不同的访问权限。理论上,ArrayList 可以有 List 没有的方法(尽管在实践中我认为没有)。

使用List 的优势在于,您可以将底层对象更改为不同类型的列表(通过更改您创建的类型),而不会违反使用它的任何代码的合同。如果你声明为ArrayList,如果你想改变底层实现,你必须改变你的合同。

披露:这是my answer 到this question 的改编形式。这基本上是同一个问题,但是当您查看您使用的术语时,您可能不会找到它。 :-)

【讨论】:

你这个自我剽窃者! :)【参考方案4】:

List a1 是一个接口,意味着例如它也可以引用LinkedList(不将实现限制为ArrayList)。

虽然 ArrayList a1 只能分配 ArrayList 实例,但有时您不希望有这种限制。

通常认为使用接口(@98​​7654326@、Map 等)而不是具体类型是更好的方法,特别是如果您将方法公开给外部应用程序,因此您不会强制执行实现细节。您只是希望变量 a1 表现为 List

【讨论】:

以上是关于试图理解在 Java 中声明对象的不同方式? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

java 接口

深入理解java合集之框架总览

对Java中多态的理解

Java中多态的一些简单理解

Java多态性理解

Java多态性理解