話不多說,先貼代碼
package com.chenxin;
public class TestForPolymorphism {
public static void main(String[] args) {
Cat catee = new Cat(10);
catee.makeVoice();
}
static abstract class Animal {
private int age = 100;
public Animal(int age) {
this.age = age;
}
public abstract void makeVoice();
}
static class Cat extends Animal {
private int age = 20;
public Cat(int age) { //當父類定義了有參構造方法,而沒有重寫無參構造方法時,必須繼承父類有參構造方法
super(age); //而且,該構造方法中必須調用父類構造方法
}
@Override
public void makeVoice() {
System.err.println("miao, my age is: " + age);
}
}
}
輸出爲:miao, my age is: 20。也就是Cat預定義的變量值。
如果改爲如下:
package com.chenxin;
public class TestForPolymorphism {
public static void main(String[] args) {
Cat catee = new Cat(10);
catee.makeVoice();
}
static abstract class Animal {
protected int age = 100;
public Animal(int age) {
this.age = age;
}
public abstract void makeVoice();
}
static class Cat extends Animal {
public Cat(int age) { //當父類定義了有參構造方法,而沒有重寫無參構造方法時,必須繼承父類有參構造方法
super(age); //而且,該構造方法中必須調用父類構造方法
}
@Override
public void makeVoice() {
System.err.println("miao, my age is: " + age);
}
}
}
即可得到預期輸出:miao, my age is: 10
首先,父類中寫了一個有參構造方法,那麼默認的無參構造方法就沒有了。子類繼承父類時,必須重寫此構造方法,而且必須在第一行調用super(age)父類構造方法。因爲在生成自身實例時,會先調用父類構造方法。
debug得知,在第一個例子中,我們傳入參數10。執行順序可以參照http://blog.csdn.net/xiangaichou/article/details/19993551:
圍繞age變量進行闡述,在父類中,首先初始化方法塊的age=100,然後執行構造方法,age=10;然後是子類,注意這裏,在方法塊時就將age改爲了自己的20,之後沒有其他針對age的操作了。
所以這個“多態”問題,主要還是考察新建實例時的執行機制。
第二個例子就簡單了。。。因爲子類沒有再重新更改age,所以還是原來的值。