[問題] 請問多型要如何執行父親的method?

看板java作者 (benson)時間8年前 (2016/05/12 12:10), 編輯推噓4(4020)
留言24則, 8人參與, 最新討論串1/1
假如 B Extends A (A,B 都有定義method F) 今宣告: A a = new B(); 請問要如何讓 a.F()執行的是A的F() 而不是B的F()?? 感恩~~ -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 123.194.134.136 ※ 文章網址: https://www.ptt.cc/bbs/java/M.1463026212.A.BAC.html

05/12 12:24, , 1F
A a = new A();
05/12 12:24, 1F

05/12 12:43, , 2F
1. 這不是多型
05/12 12:43, 2F

05/12 12:44, , 3F
2. A.F()
05/12 12:44, 3F

05/12 13:10, , 4F
不行,B把A的method override掉之後,你就不可能在B的
05/12 13:10, 4F

05/12 13:10, , 5F
instance上呼叫A的實作,除了在B裡面用super以外
05/12 13:10, 5F

05/12 13:20, , 6F
有些語言(C++,C#)會分要virtual method才會被override
05/12 13:20, 6F

05/12 13:23, , 7F
Java沒有分,叫到哪個只看instance不看reference
05/12 13:23, 7F

05/12 14:36, , 8F
改method的名字就好啦!!!
05/12 14:36, 8F

05/12 14:36, , 9F
不然就像一樓那樣新增一個Class !!!
05/12 14:36, 9F

05/12 14:37, , 10F
不曉得原po是想問觀念還是寫程式遇到的問題
05/12 14:37, 10F

05/12 17:00, , 11F
是想釐清觀念 再請教一下 如果A,B都有宣告成員變數X
05/12 17:00, 11F

05/12 17:02, , 12F
那a.X是access到A的X還是B的X?謝謝!
05/12 17:02, 12F

05/12 21:06, , 13F
任何重複執行子類別
05/12 21:06, 13F

05/12 21:08, , 14F
多型的意義是,同樣的方法,子類別會自動做對的事
05/12 21:08, 14F

05/12 21:53, , 15F
是A的X,field member沒有多型
05/12 21:53, 15F

05/13 05:34, , 16F
(A) a.F() 記得可以cast成A
05/13 05:34, 16F

05/13 14:17, , 17F
最近看書學到 java的方法呼叫: non-virtual方法 例如
05/13 14:17, 17F

05/13 14:17, , 18F
static方法 private方法 new物件的constructor方法 f
05/13 14:17, 18F

05/13 14:17, , 19F
inal 方法及容易搞混的方法overloading 都是在編譯期
05/13 14:17, 19F

05/13 14:17, , 20F
就能知道要且決定要呼叫那一個方法 儲存在bytecode裡
05/13 14:17, 20F

05/13 14:17, , 21F
然後JVM照著執行 然而多型的 overriding 是執行期才
05/13 14:17, 21F

05/13 14:17, , 22F
能知道物件的具體型別 查詢 virtual method table 決
05/13 14:17, 22F

05/13 14:17, , 23F
定要呼叫那個方法 至於直接存取類別欄位根本不是方法
05/13 14:17, 23F

05/13 14:17, , 24F
呼叫 所以與多型無關
05/13 14:17, 24F
文章代碼(AID): #1ND08aki (java)