【发布时间】:2014-09-19 13:06:48
【问题描述】:
我正在审查我的 OOP,我对对象有一个小问题。好吧,我有一个超类Ship,它也是一个抽象类。 Ship 有一些子类,即Submarine、Destroyer 等。
我知道我无法创建 Ship 类的对象,因为它是抽象的。但是为什么以下仍然有效?
Ship s1 = new Submarine("ship 1");
【问题讨论】:
-
不能实例化抽象类,并不意味着不能拥有该类型的对象。也可以有某个接口的对象,比如
List<String> strings = new ArrayList<>(); -
因为在这一行中,您创建了一个
Submarine类型的对象,然后将其转换为Ship类型。SubmarineIS-AShip -
它是多态性 - 你有 Submarine 对象,但你将它视为 Ship。
-
它有效,因为您正在实例化 Ship 的子类,而不是 Ship 本身。您声明抽象方法以确保每个扩展抽象类的类都将实现此方法。