2015-04-05 33 views
3

我有一類名爲Student和子類,稱爲AthleteStudent多態性已經失去了與鑄造

現在,讓我們這些測試用例:

AthleteStudent ats = new AthleteStudent("test", 22, "Karate"); 
Student std; 

std = ats; // upcasting OK 
/* ats and std point to the same object, i.e AthleteStudent */ 

ats.hello(); /* Hello I'm AthleteStudent => polymorphism OK */ 
std.hello(); /* Hello I'm AthleteStudent => polymorphism OK */ 

我不明白這裏是這個:

即使std引用AthleteStudent我無法訪問方法changeDepartement()

std.changeDepartement(); // Doesn't work 

只有當我們投這個對象像這樣的工作原理

((AthleteStudent) std).changeDepartement(); // OK 

爲什麼我們需要強制std是一個AthleteStudent對象知道它是作爲AthleteStudent物體進行處理?用第一個例子,std.hello()打印AthleteStudent執行沒有問題。

+0

簡而言之,您不能在Java中投射對象。但是,您可以使用Java進行參考。 – zee 2015-04-05 16:57:57

回答

8

這不是多態性的損失。這是缺少duck typing。當靜態編譯器只知道它是一個Student它不允許你調用非Student方法。即使你知道,在運行時,它將可用java的靜態分類系統說不。其他語言有鴨子打字,不關心。 Java不是其中之一。

+0

謝謝,我現在明白爲什麼會發生這個問題 – elDiablo 2015-04-05 16:47:47

4

std類型爲Student,它可能會保留對不是AthleteStudent的對象的引用。因此,如果沒有明確轉換到AthleteStudent,則不能撥打std.changeDepartement()

+0

也謝謝你:) Eran – elDiablo 2015-04-05 16:48:14