動手動腦之繼承與派生
1.自行編寫代碼驗證在子類中,若要調用父類中被覆蓋的方法,可以使用super關鍵字
class animal { public void tedian(int a,int b) { System.out.println("動物函數:"+a+"*"+b+"="+a*b); } } class bird extends animal { public void tedian(int a,int b) { super.tedian(a+1,b+1); System.out.println("鳥函數:"+a+"*"+b+"="+a*b); } }public class Test { public static void main(String[] args) { bird A=new bird(); A.tedian(1,2); } }
若在子類中未加super,則只顯示鳥函數。
2.下列語句哪一個將引起編譯錯誤?為什麽?哪一個會引起運行時錯誤?為什麽?m=d;d=m; d=(Dog)m; d=c;c=(Cat)m;先進行自我判斷,得出結論後,運行TestCast.java實例代碼,看看你的判斷是否正確。
第一個正確,第二個不正確,第三個正確,第四個不正確,第五個正確。
classMammal{} class Dog extends Mammal {} class Cat extends Mammal{} public class TestCast { public static void main(String args[]) { Mammal m; Dog d=new Dog(); Cat c=new Cat(); m=d; //d=m; d=(Dog)m; //d=c; //c=(Cat)m; } }
子類對象可以賦值給父類,而父類賦值給子類必須經過子類強制轉換,子類之間不能互相賦值。
3.
public class ParentChildTest { public static void main(String[] args) { Parent parent=new Parent(); parent.printValue(); Child child=new Child(); child.printValue(); parent=child; parent.printValue(); parent.myValue++; parent.printValue(); ((Child)parent).myValue++; parent.printValue(); } } class Parent{ public int myValue=100; public void printValue() { System.out.println("Parent.printValue(),myValue="+myValue); } } class Child extends Parent{ public int myValue=200; public void printValue() { System.out.println("Child.printValue(),myValue="+myValue); } }
猜測結果:第一行為Parent.printValue(),myValue=100 第二行為Child.printValue(),myValue=200 第三行為Child.printValue(),myValue=200 第四行為Child.printValue(),myValue=201 第五行為Child.printValue(),myValue=201
運行結果:
總結:子類對象可以賦值給父類,而父類賦值給子類必須經過子類強制轉換。子類能覆蓋父類,但是父類中的變量的值是不改變的,訪問父類中的變量時可用super來訪問。父類被覆蓋時,對父類中的變量進行操作時,父類中的變量改變,但輸出時仍輸出子類的變量。(child)Parent.myValue++,這時改變的是覆蓋父類的子類。當子類與父類擁有一樣的方法,並且讓一個父類變量引用一個子類對象時,到底調用哪個方法,由對象自己的“真實”類型所決定,這就是說:對象是子類型的,它就調用子類型的方法,是父類型的,它就調用父類型的方法。這個特性實際上就是面向對象“多態”特性的具體表現。如果子類與父類有相同的字段,則子類中的字段會代替或隱藏父類的字段,子類方法中訪問的是子類中的字段(而不是父類中的字段)。如果子類方法確實想訪問父類中被隱藏的同名字段,可以用super關鍵字來訪問它。如果子類被當作父類使用,則通過子類訪問的字段是父類的!
動手動腦之繼承與派生