昨天有人問我一個問題,在接受採訪時:何時可以引用的類型與其對象的類型不同?
假設class A
是一個基類,並class B
是派生類。
是否有可能創建的對象:
class B = new class A?
class A = new class B?
如果是的話,那麼會發生什麼?
昨天有人問我一個問題,在接受採訪時:何時可以引用的類型與其對象的類型不同?
假設class A
是一個基類,並class B
是派生類。
是否有可能創建的對象:
class B = new class A?
class A = new class B?
如果是的話,那麼會發生什麼?
通常情況下,允許自動轉換下降的等級,但不是上升。也就是說,您可以自動將派生類轉換爲其基類,但不能相反。所以只有你的第二個例子是可能的。 class A = new class B
應該沒問題,因爲派生類B可以轉換爲基類A。但class B = new class A
將不會工作自動,但可以通過提供顯式轉換(重載構造函數)來實現。
A是超類和B是子類/派生類 聲明 類A =新的B類始終是可能的,它被稱爲向上轉型,因爲你是往上走的更具體的方面更一般 例子:
水果類是一個基類,蘋果類派生 我們可以說蘋果是更加具體,必須具備一個水果所有的質量 ,所以你總是可以做上溯造型,其中作爲
向下轉換並不總是可行的因爲Apple a = new Fruit();
一個水果可以是一個蘋果或可能是不
對象都保證也是這種類型的關係被稱爲"Is-a,"或繼承A型的對象,在OOP是得到的一種標準方法polymorphism。例如,如果類型A的對象具有方法foo()
,則類型B的對象也必須提供它,但其行爲允許不同。
反過來不是必然 true:類型A(基類)的對象不總是類型B(派生類)的對象。即使是這樣,編譯時也無法保證,所以你的第一行會發生什麼,代碼將無法編譯。
什麼第二行則取決於語言,但一般
第二個示例中的代碼是標準慣例,當您對API比對其實現更感興趣時,並且希望儘可能使代碼儘可能通用。例如,經常在Java中寫一些東西,如List<Integer> list = new ArrayList<Integer>()
。如果您決定稍後使用鏈表實現,則不必更改使用list
的任何代碼。
K精,但告訴我1周的事情,如果有方法(的getData())具有相同名稱的基礎類和派生類B和,如果我創建對象像A類=新的B類();那麼在基類方法或派生類方法中哪一個稱爲1st ...? – user3464883
@ johncip的回答很好地解決了這個問題,我想。這個問題取決於語言。 –