你好 StackOverflowers。
这几乎可以肯定是关于对象实例化的一个非常基本的问题,但在以下代码示例中:
List myList = new LinkedList();
这是一种继承吗?换句话说,人们会不会读到这个有 LinkedList “是一个” List 并因此继承了 List 类中定义的方法?如果是这样,假设用户构建了他或她自己的两个类并使用与上述相同的语法,答案是否相同?
谢谢大家。
凯特琳
这是一种继承吗?
不。
有人会读到这个有LinkedList“是一个”列表吗
是的。
因此继承了 List 类中定义的方法?
No.List
是一个接口,因此不能扩展/继承(仅实现)。但LinkedList
仍然通过 asIS-A
因为它实现List
了接口所需的所有方法。
如果用户构建了他或她自己的两个类,一个是基类,另一个是从它派生的,那么是的,它将是继承。但是,以下
BaseType base = new SubType();
并不完全展示继承,而是通过继承使多态成为可能,即因为子类型基类型也可以分配给基类型引用。IS-A
不完全是,因为List
是实现的接口LinkedList
,而不是 的超类LinkedList
。您应该阅读接口。没有's 方法的继承List
- 相反,只需要在接口LinkedList
中列出方法。List
有一条原则说“始终针对接口而不是实现编程”。LinkedList 是 List 接口的一个实现。也就是说,List 只是指定 List 可以做什么,但没有说明它是如何做的。
LinkedList 类“遵守” List 的规范,因此当我们编写程序时,我们可以依赖 LinkedList 的行为方式与 List 指定的完全相同。这使得程序更加健壮,因为如果您决定使用另一种类型的 List,例如 ArrayList,那么您的程序代码不会更改,因为您不依赖于 List 的实现细节。
当您声明一个变量时
List myList;
List 类型称为“表观”类型。也就是说,编译器会将 myList 视为其余代码中的 List。您不能引用不属于 List 规范的 myList 的任何功能(不强制转换和破坏原则)。
当您实例化对象时
= new LinkedList();
LinkedList 类型被称为“实际类型”。编译器不太关心这个。它只在运行时很重要。