2017-03-17 251 views
0
Animal animal = new Animal(); 

Animal animal2 = new Dog(); 

Dog animal3 = new Dog(); 


public class Animal { 

    int age; 
    String name; 

    public Animal() { 
     name = "Empty"; 
     age = 0; 
    } 

    public Animal(int a, String n) { 
     name = n; 
     age = a; 
    } 

    public void move() { 
     System.out.println("Moved"); 
    } 
} 

public class Dog extends Animal { 

    public Dog() { 
     this.name = "dog"; 
     this.age = 0; 
    } 

    public Dog(int a, String n){ 
     this.name = n; 
     this.age = a; 
    } 
} 

嗨,我正在學習Java,我想了解它們之間的區別。我知道animal是Animal類型,animal3是Dog類型,但是animal2是什麼類型?這裏究竟發生了什麼?謝謝。變量聲明

+2

瞭解繼承 – Jens

+1

而關於多態性。這是使用OOP的這個屬性的例子之一。 –

+0

這個概念在java中稱爲Upcasting,因爲我們在這裏將它轉換爲超類型Animal,animal2仍然是一個引用Animal的狗對象。這是完全有效的,因爲如果你看到狗是一隻動物。 (小心,因爲它拋出'ClassCastException') –

回答

1
Animal animal2 = new Dog(); 

Dog類是Animal子類,因爲類Dog繼承由於類動物的這個參考的Animal類的屬性,持有它的子類的對象,它是類狗,但如果你想調用方法的是override在一流的狗。將調用類Dog的方法。

回答你的問題的:

對象animal2是類型類犬。但其參考變量爲Animal

+0

如果animal2是類型Dog,並且它的引用變量是Animal類的,那麼當我調用同名的方法時,它是否使用類Animal或class Dog中的方法? – Ken

+0

類的方法將被調用。 –

0

Animal animal2 = new Dog(); 這是騎在Concept.Over騎馬是一個多態概念,其中父類的方法由子類使用。

0
Animal animal = new Animal(); 

    Animal animal2 = new Dog(); 

    Dog animal3 = new Dog(); 

這三行是你的三個對象anima animal2 animal3

從你的主類動物的聲明中,您有兩個不同的構造

首先是public Animal()它不具有任何參數,第二個是public Animal(int a, String n)

之後,你有一個子類Dog它繼承了你的主類的屬性Animal

裏面你繼承Dog有兩個構造也public Dogpublic Dog(int a, String n)

從你的對象的聲明之上你打電話,你會用什麼樣的構造。

更好地閱讀Java文檔進一步學習click here