请注意,您不能构造抽象类的对象,但您仍然可以拥有类型为抽象类的对象引用。当然,它所引用的实际对象必须是具体子类的实例:
Account anAccount; // OK
anAccount = new Account(); // Error—Account is abstract
anAccount = new SavingsAccount(); // OK
anAccount = null; // OK
不明白为什么你可以有一个抽象类的对象引用......
请注意,您不能构造抽象类的对象,但您仍然可以拥有类型为抽象类的对象引用。当然,它所引用的实际对象必须是具体子类的实例:
Account anAccount; // OK
anAccount = new Account(); // Error—Account is abstract
anAccount = new SavingsAccount(); // OK
anAccount = null; // OK
不明白为什么你可以有一个抽象类的对象引用......
当您有一个类型为抽象类的对象引用时,该引用并不意味着“我正在引用一个抽象类”。相反,它的意思是“我正在引用一些实际对象,它是那个抽象类的子类。” 这就是为什么您可以让引用引用 a SavingsAccount
,这是一个从 子类化的非抽象类Account
,但您不能让它指向 a new Account()
,因为您实际上无法实例化Account
。
请注意,引用本身并不是抽象类的实际实例。
希望这可以帮助!
问题是您不能调用抽象成员例程。
当您调用“新”时,您实际上是在调用类的构造函数。
因为你试图调用一个抽象成员函数,你会得到一个错误。
您可以引用抽象类,因为它只是派生自它的真实类的蓝图。有点像接口,但具有继承性。
就像您无法实例化接口一样,您也无法实例化抽象类。
这当然是多态性的一部分。
抽象类和接口之间的差异非常小,请参阅:接口与抽象类(通用 OO)