我试图了解以下2行代码之间的区别。
我知道其中一个属于引用类型List
而另一个属于引用类型ArrayList
。但这真的很重要,还是只有两种不同的方式做同样的事情?
它不仅适用于这些类/接口,还适用于其他类。我相信它是一个多态性的一个对象采取不同的形式是正确的吗?
List a1 = new ArrayList();
ArrayList a1 = new ArrayList();
答案 0 :(得分:2)
您没有声明对象,您声明变量(和成员)。
接口与对象的区别。在第一种情况下,界面为List
,而在第二种情况下,界面为ArrayList
。底层对象是相同的,但您对它有不同的访问权限。从理论上讲,ArrayList
可能会有List
没有的方法(尽管在实践中我并不认为这样做)。
使用List
的好处是,您可以将基础对象更改为不同类型的列表(通过更改您创建的类型),而不会违反与使用它的任何代码的合同。如果您将其声明为ArrayList
,则如果要更改基础实现,则必须更改合同。
披露:这是my answer到this question的改编形式。它基本上是同一个问题,但在查看您使用的术语时,您可能无法找到它。 : - )
答案 1 :(得分:0)
List a1
是一个界面,意味着它也可以引用LinkedList
(不会将实施限制为ArrayList
)。
虽然ArrayList a1
只能分配ArrayList
个实例,但这是您不希望有的限制。
通常认为使用接口(List
,Map
等)而不是具体类型的更好方法,特别是如果您将方法暴露给外部应用程序,因此您不会强制执行实现细节。您只希望变量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()