1. 程式人生 > >動手動腦之繼承與派生

動手動腦之繼承與派生

args 編寫代碼 自己 [] 變量引用 技術 extend 動物 ++

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實例代碼,看看你的判斷是否正確。

第一個正確,第二個不正確,第三個正確,第四個不正確,第五個正確。

class
Mammal{} 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關鍵字來訪問它。如果子類被當作父類使用,則通過子類訪問的字段是父類的!

動手動腦之繼承與派生