1、這種結果是正確的。2、具體原因如下: 一,第一種情況輸出“父類”,是由於子類中並沒有重寫fun方法,而且父類的print方為private為不可重寫,雖然你的子類中看上去重寫了,其實是兩個無關print方法,只是方法名而已,在多型呼叫的時候,只會直接找父類的print方法,故導致你在子類Student物件中呼叫fun方法時,實際是呼叫父類的private。 二,第二種情況輸出“子類”,是由於子類中重寫了父類的print方法,按照多型機制,呼叫fun方法時的print執行,實際執行的是子類的重寫後的print方法,故輸出為“子類”。3、其實核心就是多型呼叫的方法棧和方法的可視範圍。4、建議做如下測試,然後自己再總結總結 **可以將父類的private改成protected或是public **讓子類重寫下父類的fun方法,形式為public void fun(){print())即可。 細看下一、二兩點,應該可以解決樓主的困惑。
1、這種結果是正確的。2、具體原因如下: 一,第一種情況輸出“父類”,是由於子類中並沒有重寫fun方法,而且父類的print方為private為不可重寫,雖然你的子類中看上去重寫了,其實是兩個無關print方法,只是方法名而已,在多型呼叫的時候,只會直接找父類的print方法,故導致你在子類Student物件中呼叫fun方法時,實際是呼叫父類的private。 二,第二種情況輸出“子類”,是由於子類中重寫了父類的print方法,按照多型機制,呼叫fun方法時的print執行,實際執行的是子類的重寫後的print方法,故輸出為“子類”。3、其實核心就是多型呼叫的方法棧和方法的可視範圍。4、建議做如下測試,然後自己再總結總結 **可以將父類的private改成protected或是public **讓子類重寫下父類的fun方法,形式為public void fun(){print())即可。 細看下一、二兩點,應該可以解決樓主的困惑。