1. 程式人生 > >第七週動手動腦(2018.10.29-11.4)

第七週動手動腦(2018.10.29-11.4)

動手動腦1:

執行 TestInherits.java 示例,觀察輸出,注意總結父類與子類之間構造方法的呼叫關係修改Parent構造方法的程式碼,顯式呼叫GrandParent的另一個建構函式,注意這句呼叫程式碼是否是第一句,影響重大!

執行截圖:

結論:通過 super 呼叫基類構造方法,必須是子類構造方法中的第一個語句。

動手動腦2:

請自行編寫程式碼測試以下特性:

在子類中,若要呼叫父類中被覆蓋的方法,可以使用super關鍵字。

package ceshi;

class Animal {

    public int age=10;

    public String name;

    public void eat(){

           System.out.println("吃東西");

    }

    public Animal(int age){

           this.age=age;

    System.out.println("執行了構造方法");

    }

   



}

class Dog extends Animal{

    public int age=20;

    public void eat(){

           System.out.println("狗能吃骨頭");

           }

           public Dog(int age){

                  super(age);

                  System.out.println("Dog構造方法執行了");

           }

}
package ceshi;

public class Test {

    public static void main(String[] args){

           Animal a=new Animal(10);

           a.eat();

           Dog b=new Dog(20);

           b.eat();

           
    }
    }

  截圖:

動手動腦3:

 

答:

1.

2.

(1)子類物件可以賦值給父類的物件。父類進行子類強制轉換可以賦值給子類的物件。

(2)子類能覆蓋父類,但是父類中的變數的值是不改變的,訪問父類中的變數時可用super來訪問,反之則一直被子類覆蓋。父類被覆蓋時,對父類中的變數進行操作時,父類中的變數改變,但輸出時仍輸出覆蓋父類的子類的變數。

(3)(child)Parent.myValue++,這時改變的將是覆蓋父類的子類。

3.

當子類與父類擁有一樣的方法,並且讓一個父類變數引用一個子類物件時,到底呼叫哪個方法,由物件自己的“真實”型別所決定,這就是說:物件是子型別的,它就呼叫子型別的方法,是父型別的,它就呼叫父型別的方法。

這個特性實際上就是面向物件“多型”特性的具體表現。

如果子類與父類有相同的欄位,則子類中的欄位會代替或隱藏父類的欄位,子類方法中訪問的是子類中的欄位(而不是父類中的欄位)。如果子類方法確實想訪問父類中被隱藏的同名欄位,可以用super關鍵字來訪問它。

如果子類被當作父類使用,則通過子類訪問的欄位是父類的!