Hello StackOverflowers。
这几乎肯定是关于对象实例化的一个非常基本的问题,但在下面的代码示例中:
List myList = new LinkedList();
这是一种继承形式吗?换句话说,是否会读取这个LinkedList“是一个”List并因此继承List类中定义的方法?如果是这样,如果用户构造了他或她自己的两个类并使用了与上面相同的语法,那么答案是否相同?
谢谢大家。
凯特琳
答案 0 :(得分:5)
这是一种继承形式吗?
没有
如果读取这个,则LinkedList“是一个”List
是
因此继承了List类中定义的方法?
没有。 List
是一个接口,因此无法扩展/继承(仅实现)。但LinkedList
仍然以IS-A
传递,因为它实现 List
接口所需的所有方法。
如果用户构建了两个他或她自己的类,其中一个是 base 类,另一个派生,那么是将是继承。但是,以下
BaseType base = new SubType();
并未完全演示继承,但继承使多态成为可能,即因为子类型IS-A
基类型也是如此它可以分配给基本类型引用。
答案 1 :(得分:4)
不完全是因为List
是接口LinkedList
实现,而不是超类LinkedList
。你应该阅读接口。 List
方法没有继承 - 相反,只需要LinkedList
具有List
接口中列出的方法。
答案 2 :(得分:1)
有一个原则是“始终编程到接口而不是实现”。 LinkedList是List接口的实现。也就是说,List只是指定List可以做什么,但没有说明它是如何做的。
LinkedList类“服从”List的规范,因此当我们编写程序时,我们可以依赖于LinkedList的行为,与List指定的方式完全相同。这会产生更强大的程序,因为如果您决定使用其他类型的List,比如说ArrayList,那么您的程序代码不会改变,因为您不依赖于List的实现细节。
在
中声明变量时 List myList;
List类型称为“明显”类型。也就是说,编译器会将myList视为其余代码中的List。你不能引用myList的任何不属于List规范的特性(没有强制转换和违反原则)。
在
中实例化对象时 = new LinkedList();
LinkedList类型称为“实际类型”。编译器并不关心这个问题。它只在运行时才有意义。