【问题标题】:Relationship between ArrayList / ObservableList / List and Classes & Interfaces in General [duplicate]ArrayList / ObservableList / List与类和接口之间的关系一般[重复]
【发布时间】:2016-04-19 15:20:07
【问题描述】:

我希望能对一个我觉得非常困惑的话题进行澄清:ArrayList / List / ObservableList 之间的关系,这也与类和接口之间的差异有关。我已经阅读了有关该主题的多篇文章,并且我阅读的越多,我变得越困惑。

我确实知道:ArrayList 是一个类,这意味着您可以创建任意数量的 ArrayList 对象。 (这对我来说是个好消息,因为我喜欢和他们一起工作。)我也在学习 JavaFX,并且有很多 FX 对象以 ObservableLists 作为输入。但是 ObservableLists 是接口,而不是类,所以忘记创建任何 ObservableList 对象。起初,我假设 ArrayList 是 List 的子类,而 ObservableList 是 List 和任何 List 子类的接口。 …但进一步阅读,我发现 List 实际上是一个接口,而不是一个类,而 ArrayList 的父类是 AbstractList。所以这对我来说并不是很清楚。

另一个让我抓狂的地方:在另一个论坛帖子中,一位更聪明的编码员给了我这个 sn-p 的代码,以帮助我通过 ObservableList 接口访问我的 ArrayList:

List<myClass> myList = new ArrayList<myClass>();

虽然这种声明和初始化 ArrayList 的方法可以编译并且效果很好,但我只是不明白这里发生了什么。我认为 List 是一个接口,而不是一个类,那么如何创建一个 List 类型的 myList 对象呢?如果我不得不猜测,我会假设有一个名为 List 的接口和另一个名为 List 的单独类,并且由于这里的上下文,Java 假设我指的是该类。

关于一个附带问题,是否有推荐的网站或文本可供人们推荐我在此主题上查阅?我已经阅读了 Oracle 网站上的“Java in a Nutshell”、该网站上的不同帖子、“Java for Dummies”和“Java in a Nutshell Examples”,但还没有说明。非常感谢任何有关理解该主题的指导。

非常感谢! -RAO

【问题讨论】:

  • 对不起,我在发帖前搜索了论坛,没有看到我认为是重复的帖子。

标签: java list arraylist interface observablelist


【解决方案1】:

简短(如此简短)的简历:

java.util.List 是一个接口。也就是说,定义实现该接口的所有类都应编码的协定(抽象类除外) java.util.ArrayList 是实现该接口的类

由于您无法实例化任何接口,因此您必须使用实现类(f.i. ArrayList),但是,您可以将其作为接口进行管理,无论其背后的真实类是什么。你只知道你的类实现了接口中的所有方法。

所以,

List<myClass> myList = new ArrayList<myClass>();

只是意味着您正在实例化一个 List(实际上是一个 ArrayList),这意味着您将通过 java.util.List 接口中定义的方法来管理该列表

查看link 了解有关使用接口的完整信息

【讨论】:

  • 嗨 Jorge,当我读到这篇文章时,我的灯泡亮了。你的回答让我想到了一个位于 ArrayList 对象之上的 List 类型的接口,就像一种面具。我想我现在明白了——知道一个接口“适合”一个对象/类允许你使用那个对象。啊哈!太棒了,谢谢!!!
【解决方案2】:

如果几本书和文章对您没有帮助,也许不同的观点会。让我们看一下您概述的声明:

List<myClass> myList = new ArrayList<myClass>();

您实际上并没有在此处实例化 List。您正在实例化一个ArrayList,并引用该对象,其引用类型为List。这意味着当您使用myList 时,编译器会将对象视为List,即使它引用的对象是ArrayList。这行编译是因为编译器查看实例化与引用类型并说:“是的,这个ArrayListList,所以这是合法的。(Doing this allows you to ensure type safety by always havingmyListconform to typeList, no matter what kind ofList` 它参考)。

ArrayListList,因为它实现了List 接口。但是,接口没有定义它们的方法。那么当我们这样做时会发生什么?

myList.add(myObj);

这里是它如何发生的简化版本。编译器查看myList.add 并说“是的,myList 是List,而List 有一个方法add,所以这段代码可以工作。”好吧,List 没有定义它是如何工作的(该方法本质上是抽象的),所以当这个动作实际上是 run 时,它会查看对象的列表类型,ArrayList,它告诉机器将对象添加到列表的末尾。它确实如此。 (这也是为什么在实现接口时必须定义接口的每个方法的原因。)

我不能说这个故事形式的答案是完全准确的,但它可能会对你有所帮助。

【讨论】:

  • 这确实有帮助,谢谢!非常感谢...!
猜你喜欢
  • 2013-07-11
  • 1970-01-01
  • 2017-08-20
  • 2018-02-23
  • 2013-03-29
  • 1970-01-01
  • 2013-11-14
  • 2021-01-19
  • 1970-01-01
相关资源
最近更新 更多