【问题标题】:Trying to understand different ways of declaring an object in Java? [duplicate]试图理解在 Java 中声明对象的不同方式? [复制]
【发布时间】:2014-05-25 13:46:27
【问题描述】:

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

我知道一个是引用类型List 而另一个是引用类型ArrayList 是有原因的。但这真的很重要,还是只是做同一件事的两种不同方式?

它不仅适用于这些类/接口,也适用于其他类/接口。我相信这是一个具有不同形式的对象的多态性特征,对吗?

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

【问题讨论】:

    标签: java


    【解决方案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 answerthis question 的改编形式。这基本上是同一个问题,但是当您查看您使用的术语时,您可能不会找到它。 :-)

        【讨论】:

        • 你这个自我剽窃者! :)
        【解决方案4】:

        List a1 是一个接口,意味着例如它也可以引用LinkedList(不将实现限制为ArrayList)。

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

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

        【讨论】:

          猜你喜欢
          • 2014-05-09
          • 1970-01-01
          • 2012-02-26
          • 2012-07-13
          • 1970-01-01
          • 2011-01-29
          • 1970-01-01
          • 2012-11-13
          • 1970-01-01
          相关资源
          最近更新 更多