This question already has answers here:
What does it mean to “program to an interface”?
                                
                                    (32个答案)
                                
                        
                                3年前关闭。
            
                    
我希望对我感到非常困惑的一个主题进行澄清:ArrayList / List / ObservableList之间的关系,这也与类和接口之间的差异有关。我读过关于该主题的多篇文章,阅读的越多,我就越困惑。

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

令我发疯的另一点是:在另一个论坛帖子中,一个更明智的编码器为我提供了以下代码片段,以帮助我通过ObservableList接口访问ArrayList:

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


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

附带的问题是,有没有一个推荐的网站或文本可供人们推荐我参考该主题?我已经阅读了Oracle网站上的“坚果中的Java”,该站点上的不同文章,“傻瓜Java”和“坚果中的Java示例”,但尚未阐明。非常感谢您理解该主题的任何指导。

非常感谢!
-饶

最佳答案

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

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

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

所以,

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


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

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

09-16 03:50