1. 程式人生 > >11月1日的動手動腦

11月1日的動手動腦

1.動手實驗:繼承條件下的構造方法呼叫

程式碼如下

 

class Grandparent 
{


    public Grandparent()
     {

            System.out.println("GrandParent Created.");
}

    public Grandparent(String string) 
    {

            System.out.println("GrandParent Created.String:" + string);
    
 }

}
class Parent extends
Grandparent { public Parent() { //super("Hello.Grandparent."); System.out.println("Parent Created"); // super("Hello.Grandparent."); } } class Child extends Parent { public Child() { System.out.println("Child Created"); } }
public class TestInherits { public static void main(String args[]) { Child c = new Child(); } }

ok,我們來看一看輸出結果:

GrandParent Created.
Parent Created
Child Created

注意順序:是先祖父,再父親最後是兒子。也就是呼叫的時候會優先呼叫其父類的建構函式,兒子類的要排到後面了。而且看程式裡面有兩個super語句,super語句是專門用來呼叫前一個父類的方法,實驗可以得到,super的構造語句必須放在前面。

2.為什麼子類的構造方法在執行之前,必須呼叫父類的構造方法?能不能反過來?為什麼不能反過來?

答:構造一個物件,先呼叫其構造方法,來初始化其成員函式和成員變數。子類擁有父的成員變數和成員方法,如果不呼叫,則從父類繼承而來的成員變數和成員方法得不到正確的初始化。不能反過來呼叫也是這個原因.

3.神奇的“+”號

 

public class Fruit
{
        
    public String toString()
    {
        return "Fruit toString.";
    }

    public static void main(String args[])
    {
        Fruit f=new Fruit();
        System.out.println("f="+f);
    //    System.out.println("f="+f.toString());
    }
}

 

結果是:f=Fruit toString.

 

答:在“+”運算中,當任何一個物件與一個String物件,連線時,會隱式地呼叫其toString()方法,預設情況下,此方法返回“類名 @ + hashCode”。為了返回有意義的資訊,子類可以重寫toString()方法。

4.

請自行編寫程式碼測試以下特性(動手動腦): 在子類中,若要呼叫父類中被覆蓋的方法,可以使用super關鍵字:

 

class Parent
{
    public void show()
    {
        System.out.println("123");
    }
}
class Child extends Parent
{
    public void show()
    {
        super.show();
        System.out.println("321");
    }
}
public class asd {
    public static void main(String [] args)
    {
        Child c = new Child();
        c.show();
    }

 輸出結果是:

123

321

因為super方法在子類覆蓋方法類使用,只有這樣才能呼叫父類中被覆蓋的方法,並且super語句放在子類覆蓋方法的話位置就沒有要求了。

5.現在有三個類: class Mammal{} class Dog extends Mammal {} class Cat extends Mammal{}

針對每個類定義三個變數並進行初始化 Mammal m=null ; Dog d=new Dog(); Cat c=new Cat();

下列語句哪一個將引起編譯錯誤?為什麼?哪一個會引起執行時錯誤?為什麼?

m=d; d=m; d=(Dog)m; d=c; c=(Cat)m;