話不多說,直接看源碼
Hero.java
public class Hero {
public String name;
public float hp;
public int damage;
public Hero() {
}
// 增加一個初始化name的構造方法
public Hero(String name) {
this.name = name;
}
// 重寫toString方法
public String toString() {
return name;
}
}
APHero.java
public class APHero extends Hero {
public String name;
public float hp;
public int damage;
public APHero() {
}
// 增加一個初始化name的構造方法
public APHero(String name) {
this.name = name;
}
// 重寫toString方法
public String toString() {
return name;
}
public void magicAttack() {
System.out.println("進行魔法攻擊");
}
}
TestCollection.java
public class TestCollection {
public static void main(String[] args) {
ArrayList<Hero> hs = new ArrayList<>();
ArrayList<APHero> aphs = new ArrayList<>();
hs.add(new Hero("nomarl Hero"));
aphs.add(new APHero("AP Hero"));
iterate(hs);
iterate(aphs);
}
public static void iterate(ArrayList<? extends Hero> list){
for (Hero hero : list){
System.out.println(hero.name);
}
}
}
我們的運行結果是這樣的:
爲什麼APHero的name是null呢?
如果在Hero,APHero類中都定義有變量name,則在執行
for (Hero hero : list) { System.out.println( hero.name ); }
這裏的時候,會輸出hero的name,對於Hero類是沒問題的
但是對於APHero,他的構造函數得到的name是APHero裏對應的name
轉換爲父類Hero後,它們的name還是原來的name,所以 hero.name就會爲null。
解決方法:
(一)將構造函數裏的
public APHero(String name) {
this.name = name;
}
換成:
public APHero(String name) {
super(name);
}