【问题标题】:How can abstract classes have references but not objects?抽象类如何有引用但没有对象?
【发布时间】:2013-10-28 02:54:39
【问题描述】:

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

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

不明白为什么可以将对象引用到抽象类...

【问题讨论】:

    标签: java class polymorphism abstract


    【解决方案1】:

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

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

    希望这会有所帮助!

    【讨论】:

    • 好的,所以当您执行 Account anAccount 之类的操作时;那是什么意思?它实际上并没有指向任何东西?即使它不是抽象类,也可以说 String tmp;你还没给它地址?
    • @user2809437- 没错。当你说Account anAccount 时,你会得到一个名为anAccount 的引用,它最初包含null,这意味着它没有指向任何东西。与String tmp 相同;你得到一个对String的引用,但它指向null,因为你还没有分配它指向String
    • 还有一个问题……这样做有什么意义?如果你不能创建类的实例,为什么要同时使用引用?
    • @user2809437- 假设您要操作一个帐户,但不确定是哪种帐户。可能是SavingsAccount,或者可能是CheckingAccountMoneyMarketAccountTreasuryAccount 等。拥有Account 类型的引用意味着您可以拥有一个存储对对象的引用的变量任何这些类型,这样就可以编写适用于“一般帐户”的代码,而无需为每种类型的帐户复制代码。
    • 精彩的解释!! :)
    【解决方案2】:

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

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

    这当然是polymorphism 的一部分。
    抽象类和接口的区别非常小,见:Interface vs Abstract Class (general OO)

    【讨论】:

      猜你喜欢
      • 2012-07-11
      • 2011-07-10
      • 1970-01-01
      • 1970-01-01
      • 2020-03-12
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      相关资源
      最近更新 更多