多態對象特性
當創建一個父類的引用指向本類的對象時,如何使用這個對象調取本類的特性?例如:
父類:Traveltool;本類:Taxi;他們的特性:int site;如何調用對象obj3來調用Taxi里面的site值?
Traveltool obj3 = new Taxi();
System.out.println(obj3.site);
這個命令輸出的是Traveltool中的site值。為什么obj3是Taxi的對象,卻調用了父類的特性?
當創建一個父類的引用指向本類的對象時,如何使用這個對象調取本類的特性?例如:
父類:Traveltool;本類:Taxi;他們的特性:int site;如何調用對象obj3來調用Taxi里面的site值?
Traveltool obj3 = new Taxi();
System.out.println(obj3.site);
這個命令輸出的是Traveltool中的site值。為什么obj3是Taxi的對象,卻調用了父類的特性?
2016-07-23
舉報
2016-07-24
由于你聲明成員變量是都是public,導致Taxi類中實際上存在兩個site,兩個way變量,當對象為Traveltool時條用的則是父類的site(沒有初值默認為零),就是你的這種情況。想要輸出5則要創建一個子類的對象,如Taxi taxi = (Taxi)obj;System.out.println(taxi.site);結果就是5.
2016-08-06
這個通過存儲地址很好解釋,比如創建一個類A占用1.0M內存,類B繼承類A ,創建類B 則占用1.5M內存(即類B內存大小0.5M),當我們new B();時,編譯器為我們分配1.5M內存,分別為(A+B),當我們對象類型是類A時,類A對象就只指向1.0M內存中的數據,所以輸出0,當我們調用方法時,因為B繼承A,并且B類重寫了A的方法,所以我們看到是調用B中的方法。當然,對象類型為B時,對象指向1.5M的內存,我們輸出?site的值也就是B中的數值!(注:個人理解)
2016-07-24
謝謝,我還是沒理解透徹。語句:Traveltool obj = new Taxi(); ,實際創建的是Traveltool的對象還是Taxi的對象呢?
如果是Traveltool的對象,為什么調用的是Taxi的方法?
如果是Taxi的對象,為什么調用的是Traveltool的變量值呢?
2016-07-23
package com.imooc;
//父類
public class Traveltool {
public String way = "Traveltoll can travel!" ;
public int site;
public void canDo(){
System.out.println("Traveltool can travel fast on road! " + "Bike can take " + site + " people!");
}
}
package com.imooc;
//子類
public class Taxi extends Traveltool {
String way = "Taxi travel by road";
int site = 5;
public void canDo(){
System.out.println("Taxi can travel fast on road! " + "Bike can take " + site + " people!");
}
}
package com.imooc;
//初始化類
public class Initial {
public static void main(String[] args) {
// TODO Auto-generated method stub
Traveltool obj = new Taxi();
System.out.println(obj.site);
}
}
結果為什么是0而不是5?
2016-07-23
(我不太清楚你的意思,你是指父類和子類都定義了site這個數據嗎?額,還有,site這個數據你不封裝起來嗎?或者是site是一個方法?)根據多態性,編譯器在編譯的時會通過動態綁定生成一個方法表,如果方法中,有同樣的簽名,會自動調用一個最合適的方法。