【问题标题】:Confusion about declaring object关于声明对象的困惑
【发布时间】:2011-11-12 23:38:15
【问题描述】:

我正在学习 CoreJava 中的集合,我发现了这段代码:

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

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

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

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

【问题讨论】:

标签: java variable-declaration


【解决方案1】:

List是接口,LinkedList是接口的具体实现。 “编程到‘接口’,而不是‘实现’:http://en.wikipedia.org/wiki/Design_Patterns#Introduction.2C_Chapter_1

【讨论】:

    【解决方案2】:

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

    附:需要明确的是 - LinkedListList 的具体实现。

    【讨论】:

      【解决方案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>();
      

      【讨论】:

        【解决方案4】:

        另一个很好的例子。

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

        考虑一种方法:

        public void doStuff(LinkedList llObj){} 
        

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

        public void doStuff(List listObj) {} 
        

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

        希望这会有所帮助。

        【讨论】:

          【解决方案5】:

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

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

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

          使引用变量“a”的类型采用“List”类型的任何具体扩展。

          在下一个代码示例中:

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

          引用变量“a”可以采用“LinkedList”类型的任何扩展。

          要了解它的强大功能,我们应该检查 LinkedList 的类型层次结构: http://docs.oracle.com/javase/7/docs/api/java/util/LinkedList.html

          因此,在您的第一个示例中,您增加了将“a”引用到任何具体类型的“列表”的范围,其中还包括 LinkedList,而在第二个示例中,您将范围缩小为仅键入“LikedList”及其子类型.

          一种方法并不比另一种更好,但很大程度上取决于您的代码设计和应用程序,哪种方法最适合您的用例。

          一些不错的读物:

          子类型多态性:http://en.wikipedia.org/wiki/Polymorphism_(computer_science)#Subtyping

          【讨论】:

            猜你喜欢
            • 2020-02-25
            • 1970-01-01
            • 2013-08-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-02-13
            • 1970-01-01
            相关资源
            最近更新 更多