一個困惑我幾天才解決的看似簡單的問題,明白了對多態理解更深了一點
父類:
public?class?Animal?{
?String?name="動物";?
}
子類:
public?class?Dog?extends?Animal{
?String?name="外狗";
?
?public?Dog(){???
??name="內狗";
?}
}
測試類:
public?class?TestAnimal?{
?public?static?void?main(String[]?args)?{
??Animal?dog=new?Dog();
??System.out.println(dog.name);
?}
}
問題:
測試類結果為:
動物
但是當我注釋掉?子類String?name="外狗";這行代碼
測試類結果為:
內狗
為什么?
2016-12-14
子類: public?class?Dog?extends?Animal{ ?String?name="外狗";?//?這是定義了一個新的變量name,下面的name也是修改的這個新的變量,而不是父類中定義的那個name ?? ?public?Dog(){??? ??name="內狗"; ?} }如果你把自類中String name改成String name1,運行結果會是 內狗。
2016-12-31
Animal?dog=new?Dog();
System.out.println(dog.name);
//Dog調用的是父類中的name屬性或著(子類中繼承或重寫的父類屬性),
String?name="外狗";?//?這是定義了一個新的變量name,不能被父類引用
2016-12-25
錯了? 沒弄清楚
2016-12-25
初始化順序 父類 》》子類?????? 父類對象》子類對象》構造方法
2016-12-15
????? 正如我采納答案所說,我在子類定義了一個String name="外狗",明確了這個變量是子類的變量,它會根據多態的規則,子類同名屬性并不會覆蓋父類屬性,而是都存在的(存在哪里?內存這塊我還不清楚),所以子類構造函數初始化了子類的屬性name為“內狗”,而Anima dog=new Dog(),? dog還是用的父類的屬性name="動物"
???? 而我沒有明確定義String name=“外狗”這句,子類構造函數默認用的name是父類的name(很容易就以為初始化的是子類的屬性name), name="內狗"這行等同于super.name="內狗"。
????想更清楚的話,可以去看看這個博客 http://blog.csdn.net/l_b_h_w/article/details/52665231
2016-12-14
對象和引用這部分我弄的有點不清楚 ,請詳解
2016-12-14
為什么我寫了一個結果還是沒變呢?
2016-12-14
這是為什么呢。。。