14

请注意,您不能构造抽象类的对象,但您仍然可以拥有类型为抽象类的对象引用。当然,它所引用的实际对象必须是具体子类的实例:

Account anAccount; // OK
anAccount = new Account(); // Error—Account is abstract
anAccount = new SavingsAccount(); // OK
anAccount = null; // OK

不明白为什么你可以有一个抽象类的对象引用......

4

2 回答 2

16

当您有一个类型为抽象类的对象引用时,该引用并不意味着“我正在引用一个抽象类”。相反,它的意思是“我正在引用一些实际对象,它是那个抽象类的子类。” 这就是为什么您可以让引用引用 a SavingsAccount,这是一个从 子类化的非抽象类Account,但您不能让它指向 a new Account(),因为您实际上无法实例化Account

请注意,引用本身并不是抽象类的实际实例。

希望这可以帮助!

于 2013-10-28T02:58:05.153 回答
2

问题是您不能调用抽象成员例程。
当您调用“新”时,您实际上是在调用类的构造函数。
因为你试图调用一个抽象成员函数,你会得到一个错误。

可以引用抽象类,因为它只是派生自它的真实类的蓝图。有点像接口,但具有继承性。
就像您无法实例化接口一样,您也无法实例化抽象类。

这当然是多态性的一部分。
抽象类和接口之间的差异非常小,请参阅:接口与抽象类(通用 OO)

于 2013-10-28T03:03:00.023 回答