ArrayList / ObservableList / List和Classes&一般

时间:2016-04-19 15:20:08

标签: java list arraylist interface observablelist

我希望对一个我觉得很混乱的话题得到一些澄清:ArrayList / List / ObservableList之间的关系,它也与Classes和Interfaces之间的差异联系在一起。我已经阅读了关于这个主题的多篇文章,我读的越多,我就越困惑。

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

另一个让我发疯的事:在另一篇论坛帖子中,一位更聪明的编码人员给了我这段代码,以帮助我通过ObservableList接口访问我的ArrayLists:

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

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

关于一个问题,是否有推荐的网站或文字供人们推荐我就此主题进行咨询?我读过“Java in a Nutshell”,Oracle网站,本网站上的不同帖子,“Java for Dummies”和“Java in a Nutshell examples”,但还没有说明。任何有关理解该主题的指导都非常受欢迎。

非常感谢! -RAO

2 个答案:

答案 0 :(得分:1)

简短(简短)简历:

java.util.List是一个界面。也就是说,定义实现该接口的所有clases应该编写的合同(抽象类除外) java.util.ArrayList是实现该接口的类

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

所以,

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

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

检查此link以获取有关使用接口的完整信息

答案 1 :(得分:1)

如果有几本书和文章无法帮助你,也许会有不同的视角。我们来看看您已经概述的声明:

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

您实际上并未在此处实例化列表。您使用ArrayList类型的引用实例化List引用该对象。这意味着当您使用myList时,编译器会将对象视为List,即使它引用的对象是ArrayList。此行编译是因为编译器查看实例化与引用类型,并说,&#34;是的,此ArrayListList,因此这是合法的。(Doing this allows you to ensure type safety by always having myList { {1}}列出它引用的conform to type列表。)

, no matter what kind ofArrayList,因为它实现了List接口。但是,界面不能定义他们的方法。那么当我们这样做时会发生什么?

List

以下是它如何发生的简化版本。编译器查看myList.add(myObj); 并说&#34;是,myList是myList.addList有方法List,因此此代码可以正常工作。&#34 ;好吧,add没有定义它是如何工作的(该方法基本上是抽象的),所以当这个动作实际上是运行时,它会查看对象的列表类型, List,告诉机器将对象添加到列表的末尾。它确实如此。 (这也是在实现接口时必须定义接口的每个方法的原因。)

我无法说这个故事形式的答案是完全准确的,但它可能有助于您点击。