2016-07-19 88 views
-1

有人可以解釋這三個聲明之間的差異嗎?使用繼承初始化新類

Animal var = new Dog()

Dog var = new Dog()

Dog var = new Animal()

第二個聲明是最常用的,但我不明白左類有什麼作用VS合適的班級,或當您使用一個VS的其他。

這個假設是狗延伸動物。

回答

1

「右邊的類型」(Dog)是正在創建的實例的實際類型。 它必須是一個真正的類(不是接口)。 該類定義新對象的「真實,已實施的行爲」。

「左邊的類型」(Animal)是用於存儲對正在創建的實例的引用的變量的類型。 「左邊的類型」必須是「右邊的類」的祖先類/界面(否則您必須進行演員表演)。 使用這個變量(無管型),你將只能訪問的Animal(無附加屬性/的Dog方法)的屬性/方法,你可以假設Animal合同執行,不知道任何的詳細信息,如果類型爲Dog,您會知道。

這是非常基本的多態,請閱讀教程/書籍以獲得更多的見解。

這裏是一個小例子:

Animal a1 = new Animal(); // works 
Animal a2 = new Dog(); // works, Dog a subtype of animal 
Dog d1 = new Animal(); // does not work, Animal not a subtype of Dog 
a1 = a2; // works 
d1 = a1; // doesn't work 

// If Dog has a function "bark" and Animal has a function "breathe" 
a1.breathe(); // works 
d1.breathe(); // works 
d1.bark(); // works 
a1.bark(); // does not compile, Animal not always a Dog 

看看它是這樣的:所有Dog s爲Animal S,這樣你就可以一Dog值賦給變量Animal。但並非所有Animal都是Dog s,所以您不能將所有Animal s分配給Dog類型的變量。

+0

所以你說動物變種=新的狗()意味着它是一個類型的狗的實例,但只有訪問動物的成員? – atg

+0

@atg,是的,這是正確的,你只能通過'var'訪問''''''''''''''''''''''成員。你可以使用** casts **來訪問'Dog'方法:'((Dog)var).bark()'。但是應該儘可能避免這種情況。如果您需要訪問「Dog」特定的方法(而不是「Animal」),只需將該變量聲明爲「Dog var = ...'。 –

+0

謝謝!我正在進入我的高年級,我認爲在夏天重新閱讀一本java書籍以鞏固我的知識並不是很好,我還沒有涉及到關於多態的章節,但是一位開始學習java的同事問我一個相關的問題。我知道它與多態性有關,但我不知道足以解釋兩者之間的差異。 – atg

0
  1. 狗是一種特定的動物。所以你可以打電話給狗的動物。

  2. 當然,狗是狗。

  3. 動物可能不是狗,它可以是貓,老鼠等,因此你不能使用這種方式。