试图理解在 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
实例,但有时您不希望有这种限制。
通常认为使用接口(@987654326@、Map
等)而不是具体类型是更好的方法,特别是如果您将方法公开给外部应用程序,因此您不会强制执行实现细节。您只是希望变量 a1
表现为 List
。
【讨论】:
以上是关于试图理解在 Java 中声明对象的不同方式? [复制]的主要内容,如果未能解决你的问题,请参考以下文章