【问题标题】:Why this declaration is correct in Java为什么这个声明在 Java 中是正确的
【发布时间】:2016-11-05 04:22:45
【问题描述】:
我是 Java 新手,在这里我很困惑。这怎么可能
List<String> list = new ArrayList<String>();
List 是一个接口,它如何拥有一个作为类的 ArrayList。
【问题讨论】:
标签:
java
list
class
interface
【解决方案1】:
任何类都可以包含它的后继类,因为子类总是包含父类的所有内容,并且可以包含额外的数据。示例:
class Parent {
String someField;
}
class Child extends Parent {
//Here we can access someField field
Long anyAnotherField;
}
在 Java 中没有多重继承(A 类只能扩展一个类)。但是有一个接口和类可以继承任意数量的接口。如果您查看文档,您可以看到有interface Collection、interface List extends Collection、class ArrayList implementing List。所以你可以把你的ArrayList放在List<T>、List(不带参数)、Collection、Object(在Java中所有的类都有Object作为父类)。 (还有很多其他类,比如AbstractList,这只是例子)
【解决方案2】:
变量的类型和变量引用的对象的类型不需要相同,只要对象的类型与变量的类型兼容即可。那么兼容是什么意思呢?
这意味着对象的类型与变量的类型有“是”的关系。 ArrayList<String>“是”List<String>,因为ArrayList 实现了List 接口。也就是说,ArrayList 拥有List 定义的所有方法,并声明(通过说implements List)它符合这些方法的定义。
这是面向对象编程中的一个基本概念,称为polymorphism。也就是说,我们可以说有一个叫做List的东西,我们可以编写与Lists一起使用的代码,而该代码不知道它正在使用的实际Lists是ArrayLists或LinkedLists 或任何其他具体类型。
在这种情况下,它带有一个接口,但同样的概念也适用于对象类型层次结构。如果您有类Animal,您可能有一个更具体的子类(Dog)。任何适用于Animal 类型的东西都可以适用于Dogs,因为Dog 是一个 Animal。