试图了解在Java中声明对象的不同方法?

时间:2014-04-11 12:01:15

标签: java

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

我知道其中一个属于引用类型List而另一个属于引用类型ArrayList。但这真的很重要,还是只有两种不同的方式做同样的事情?

它不仅适用于这些类/接口,还适用于其他类。我相信它是一个多态性的一个对象采取不同的形式是正确的吗?

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

4 个答案:

答案 0 :(得分:2)

您没有声明对象,您声明变量(和成员)。

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

使用List的好处是,您可以将基础对象更改为不同类型的列表(通过更改您创建的类型),而不会违反与使用它的任何代码的合同。如果您将其声明为ArrayList,则如果要更改基础实现,则必须更改合同。

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

答案 1 :(得分:0)

List a1是一个界面,意味着它也可以引用LinkedList(不会将实施限制为ArrayList)。

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

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

答案 2 :(得分:0)

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

List a1 = new ArrayList();

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

答案 3 :(得分:0)

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

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

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