2014-05-25 63 views

回答

0

通常情況下,允許自動轉換下降的等級,但不是上升。也就是說,您可以自動將派生類轉換爲其基類,但不能相反。所以只有你的第二個例子是可能的。 class A = new class B應該沒問題,因爲派生類B可以轉換爲基類A。但class B = new class A將不會工作自動,但可以通過提供顯式轉換(重載構造函數)來實現。

+0

K精,但告訴我1周的事情,如果有方法(的getData())具有相同名稱的基礎類和派生類B和,如果我創建對象像A類=新的B類();那麼在基類方法或派生類方法中哪一個稱爲1st ...? – user3464883

+0

@ johncip的回答很好地解決了這個問題,我想。這個問題取決於語言。 –

0

A是超類和B是子類/派生類 聲明 類A =新的B類始終是可能的,它被稱爲向上轉型,因爲你是往上走的更具體的方面更一般 例子:

水果類是一個基類,蘋果類派生 我們可以說蘋果是更加具體,必須具備一個水果所有的質量 ,所以你總是可以做上溯造型,其中作爲

向下轉換並不總是可行的因爲Apple a = new Fruit();
一個水果可以是一個蘋果或可能是不

B型
1

對象都保證也是這種類型的關係被稱爲"Is-a,"或繼承A型的對象,在OOP是得到的一種標準方法polymorphism。例如,如果類型A的對象具有方法foo(),則類型B的對象也必須提供它,但其行爲允許不同。

反過來不是必然 true:類型A(基類)的對象不總是類型B(派生類)的對象。即使是這樣,編譯時也無法保證,所以你的第一行會發生什麼,代碼將無法編譯

什麼第二行則取決於語言,但一般

  • 使用具有基本類型的引用會限制你只能訪問僅基本類型都保證有成員。
  • 在Java中,如果成員名稱是「隱藏的」(Ax存在,Bx也是如此,但它們具有不同的值),當您嘗試訪問成員時,將獲得與參考而不是對象的類型。

第二個示例中的代碼是標準慣例,當您對API比對其實現更感興趣時,並且希望儘可能使代碼儘可能通用。例如,經常在Java中寫一些東西,如List<Integer> list = new ArrayList<Integer>()。如果您決定稍後使用鏈表實現,則不必更改使用list的任何代碼。

看看此相關的問題:What does Base b2 = new Child(); signify?

相關問題