java - 子類(lèi)重寫(xiě)的方法和父類(lèi)重寫(xiě)的方法,兩個(gè)之間的調(diào)用
問(wèn)題描述
1.當(dāng)子類(lèi)對(duì)象調(diào)用重寫(xiě)的方法時(shí),調(diào)用的是子類(lèi)的方法,而不是父類(lèi)中被重寫(xiě)的方法。要想調(diào)用父類(lèi)中被重寫(xiě)的方法,則必須使用關(guān)鍵字super。這句話該怎么理解呢?子類(lèi)對(duì)象調(diào)用重寫(xiě)方法,
public class Test { public static void main(String[] args) { show(new Cat()); // 以 Cat 對(duì)象調(diào)用 show 方法 show(new Dog()); // 以 Dog 對(duì)象調(diào)用 show 方法 Animal a = new Cat(); // 向上轉(zhuǎn)型a.eat(); // 調(diào)用的是 Cat 的 eat Cat c = (Cat)a;// 向下轉(zhuǎn)型c.work();// 調(diào)用的是 Cat 的 catchMouse } public static void show(Animal a) { a.eat(); // 類(lèi)型判斷if (a instanceof Cat) { // 貓做的事情 Cat c = (Cat)a; c.work(); } else if (a instanceof Dog) { // 狗做的事情 Dog c = (Dog)a; c.work(); } } } abstract class Animal { abstract void eat(); } class Cat extends Animal { public void eat() { System.out.println('吃魚(yú)'); } public void work() { System.out.println('抓老鼠'); } } class Dog extends Animal { public void eat() { System.out.println('吃骨頭'); } public void work() { System.out.println('看家'); } }這里的子對(duì)象cat和dog,調(diào)用的都是父類(lèi)的eat。怎么說(shuō)“當(dāng)子類(lèi)對(duì)象調(diào)用重寫(xiě)的方法時(shí),調(diào)用的是子類(lèi)的方法,而不是父類(lèi)中被重寫(xiě)的方法”?這話怎么理解呢?要想調(diào)用父類(lèi)中被重寫(xiě)的方法,則必須使用關(guān)鍵字super
問(wèn)題解答
回答1:你這個(gè)例子并沒(méi)有使用super 建議 將父類(lèi)的eat方法實(shí)現(xiàn)一下 再在子類(lèi) 里 使用super.eat();
“當(dāng)子類(lèi)對(duì)象調(diào)用重寫(xiě)的方法時(shí),調(diào)用的是子類(lèi)的方法,而不是父類(lèi)中被重寫(xiě)的方法” 多態(tài) 應(yīng)該知道吧. 父類(lèi)的引用 指向子類(lèi)的實(shí)例. 因?yàn)樽罱K實(shí)例的是子類(lèi) 所以 調(diào)用 的就是子類(lèi) 的方法.
但是這時(shí) 我想調(diào)用 父類(lèi)的 那個(gè)方法(eat) 怎么辦, 這時(shí)就用super 2.super 的使用例如 :
public class Test1 {public static void main(String[] args) { show(new Cat()); // 以 Cat 對(duì)象調(diào)用 show 方法 show(new Dog()); // 以 Dog 對(duì)象調(diào)用 show 方法 Animal a = new Cat(); // 向上轉(zhuǎn)型 a.eat(); // 調(diào)用的是 Cat 的 eat Cat c = (Cat)a;// 向下轉(zhuǎn)型 c.work();// 調(diào)用的是 Cat 的 catchMouse}public static void show(Animal a) { a.eat(); // 類(lèi)型判斷 if (a instanceof Cat) { // 貓做的事情Cat c = (Cat)a;c.work(); } else if (a instanceof Dog) { // 狗做的事情Dog c = (Dog)a;c.work(); }} } abstract class Animal {** void eat(){ System.out.println('父類(lèi)eat...'); } } class Cat extends Animal {public void eat() { **super.eat(); System.out.println('吃魚(yú)');}public void work() { System.out.println('抓老鼠');} } class Dog extends Animal {public void eat() { System.out.println('吃骨頭');}public void work() { System.out.println('看家');} } 輸出 結(jié)果
父類(lèi)eat...吃魚(yú)抓老鼠吃骨頭看家父類(lèi)eat...吃魚(yú)抓老鼠
