关于声明对象的困惑

时间:2011-11-12 23:38:16

标签: java variable-declaration

我正在学习Core Java丛书中的馆藏,我找到了这段代码:

      List<String> a = new LinkedList<String>();

现在我想知道为什么这段代码不是这样的:

LinkedList<String> a = new LinkedList<String>();

为什么我们将 a 声明为List?

5 个答案:

答案 0 :(得分:4)

List是接口,LinkedList是接口的具体实现。 “编程为'界面',而不是'实施':http://en.wikipedia.org/wiki/Design_Patterns#Introduction.2C_Chapter_1

答案 1 :(得分:4)

如果你需要使用特定于LinkedList的操作,那么你的第二个会工作,可能会更好。但这种需求通常很少见。第一个更通用 - 它允许您通过仅更改一行来使用不同的List实现。其他代码(如方法参数)不需要更改。

P.S。需要明确的是 - LinkedListList的具体实现。

答案 2 :(得分:3)

代码:

List<String> list = new LinkedList<String>();

优于:

LinkedList<String> list = new LinkedList<String>();

这是因为如果您将list声明为List并且您发现程序的性能不佳,则可以将代码更改为:

List<String> list = new ArrayList<String>();

并查看程序是否运行得更快。这样做的好处是,您无需更改其余代码即可进行更改。

作为结论,如果可能,将引用声明为接口List是一个接口):

List<String> list;

您可以轻松切换实现class ArrayListclass LinkedList是接口List的实现):

list = new LinkedList<String>();

list = new ArrayList<String>();

答案 3 :(得分:1)

另一个很好的例子。

  
    

为什么我们声明一个列表?

  

考虑一种方法:

public void doStuff(LinkedList llObj){} 

这显示了对用户仅允许传递LinkedList的方法的限制。

public void doStuff(List listObj) {} 

虽然此方法允许传递任何List。

希望这会有所帮助。

答案 4 :(得分:0)

在Java中,与所有其他OOP语言一样,设计的主要优势之一是多态性。多态性不包括方法,但也扩展到类,并采用子类型,多型性等名称。

在您的第一个代码示例中:

List<String> a = new LinkedList<String>();

使参考变量的类型成为&#39; a&#39;采取类型&#39;列表&#39;。

的任何具体扩展

在下一个代码示例中的位置:

LinkedList<String> a = new LinkedList<String>();

参考变量&#39; a&#39;可以采用任何类型的链接&Linked;&#39;。

要了解这方面的力量,我们应该检查LinkedList的类型层次结构: http://docs.oracle.com/javase/7/docs/api/java/util/LinkedList.html

所以在你的第一个例子中,你增加了引用范围&#39; a&#39;对于任何具体类型的&#39; List&#39;,其中还包括LinkedList,在第二个示例中,您将范围缩小为仅键入&#39; LikedList&#39;及其子类型。

一个并不比另一个好,但是对于您的代码设计和应用来说,最好的方法是哪种方法最适合您的用例。

一些好的读物:

对多态性进行分类:http://en.wikipedia.org/wiki/Polymorphism_(computer_science)#Subtyping