2017-08-21 82 views
2

我只學習多態,所以對我來說很簡單(直接從本書複製)。我嘗試將一個類作爲參數傳遞給一個方法。當我這樣做時,我可以調用超類方法,但不能調用實際的子類。使用start()方法,我儘量讓狼嗥:多態參數適用於超類,但不適用於子類

public class experiment { 
    public static void main(String[] args) { 
     PetOwner own = new PetOwner(); 
     own.start(); 

    } 
} 

//Trying polymorphic arguments 
class Vet { 
    public void giveShot(Animal a) { 
     a.howl(); 
    } 
} 
class PetOwner { 
    public void start() { 
     Vet v = new Vet(); 
     Wolf w = new Wolf(); 

     v.giveShot(w); 
    } 
} 
//Inheritance// 
//Kingdom - Animal 
class Animal { 
    public void move() { 
     System.out.println("*motions softly*"); 
    } 
} 
//Family - canine 
class Canine extends Animal { 
    public void bark() { 
     System.out.println("Woof!"); 
    } 
} 
//Species - wolf 
class Wolf extends Canine { 
    public void howl() { 
     System.out.println("Howl! Howl!"); 
    } 
} 

如果我通過嗥方法對超(動物),它工作正常。如果我直接從狼類中調用它 - 它工作正常。唯一不起作用的例子是如果我試圖通過狼類作爲參數並從那裏調用它。

這是爲什麼我嘗試這種方式,從頭部的第一個Java第187報價:

獸醫的giveShot()方法可以把你給它的任何動物。只要 的對象,你作爲這種論點是動物,它 將工作

我得到一個「找不到符號符號:方法嗥(),將動物的位置變量」錯誤。

+0

權從第一個答案:*標識符應該是方法的名字:* '也許你正在試圖指繼承的方法,這是不在父/祖先類或接口中聲明。' – GhostCat

+0

@GhostCat我已經在書中特別聲明瞭它的引用 - 獸醫的giveShot()方法可以接受任何你給它的動物。只要你作爲參數的對象是動物的*子類*,它就可以工作 –

回答

2

你叫a.howl()aAnimal類的實例。 Animal不知道如何howl。唯一的Wolf呢。

你可以定義一個方法說react(),然後覆蓋它的任何特定的子類Animal;

+0

引用我的書: Vet的giveShot()方法可以接受你給它的任何動物。只要你作爲參數的對象是動物的*子類*,它就可以工作 –

+1

@BarAkiva你應該嘗試將你的概念應用到現實世界中,並將它們視爲對象。如果你有一個人,你可能想讓它說英語,因爲你知道這個人可以說話。但是,如果告訴某人「嘿,說話」是有道理的,如果你知道該人可以開始講某種特定的語言(你的方法不知道下一次會來哪個人)並且你完全沒有想法?你的問題可以通過全部覆蓋相同的方法來解決,或者全部實現相同的方法(但是這不是關於繼承)。 –

+1

@BarAkiva從一個普通的類中,你只能調用一個通用的方法,因爲一個普通類對繼承這個普通類的可能的特定類一無所知。以及他們的方法。 –

0

您正在調用giveShot-Method中的howl-Method。動物沒有嚎叫的方法。

編輯:如果你在giveShot-Method裏面施放動物給狼,它應該可以工作。

0

是的,你可以這樣做:

class Vet { 
    public void giveShot(Animal a) { 
     a.makeNoise(); 
    } 
} 
class Animal { 
    public void move() { 
     System.out.println("*motions softly*"); 
    } 
    public void makeNoise() { 
    } 
} 
//Family - canine 
class Canine extends Animal { 
    @Override 
    public void makeNoise() { 
     System.out.println("Woof!"); 
    } 
} 
//Species - wolf 
class Wolf extends Canine { 
    @Override 
    public void makeNoise() { 
     System.out.println("Howl! Howl!"); 
    } 
} 
相關問題