在Java中,父類的變量可以引用父類的實例,也可以引用子類的實例。
多態(tài)存在的三個必要條件:要有繼承、要有重寫、父類變量引用子類對象。
當使用多態(tài)方式調用方法時:
首先檢查父類中是否有該方法,如果沒有,則編譯錯誤;如果有,則檢查子類是否覆蓋了該方法。
如果子類覆蓋了該方法,就調用子類的方法,否則調用父類方法。
動態(tài)綁定
為了理解多態(tài)的本質,下面講一下Java調用方法的詳細流程。
1) 編譯器查看對象的聲明類型和方法名。
假設調用 obj.func(param),obj 為 Cat 類的對象。需要注意的是,有可能存在多個名字為func但參數(shù)簽名不一樣的方法。例如,可能存在方法 func(int) 和 func(String)。編譯器將會一一列舉所有 Cat 類中名為func的方法和其父類 Animal 中訪問屬性為 public 且名為func的方法。
這樣,編譯器就獲得了所有可能被調用的候選方法列表。
2) 接下來,編澤器將檢查調用方法時提供的參數(shù)簽名。
如果在所有名為func的方法中存在一個與提供的參數(shù)簽名完全匹配的方法,那么就選擇這個方法。這個過程被稱為重載解析(overloading resolution)。例如,如果調用 func("hello"),編譯器會選擇 func(String),而不是 func(int)。由于自動類型轉換的存在,例如 int 可以轉換為 double,如果沒有找到與調用方法參數(shù)簽名相同的方法,就進行類型轉換后再繼續(xù)查找,如果最終沒有匹配的類型或者有多個方法與之匹配,那么編譯錯誤。
這樣,編譯器就獲得了需要調用的方法名字和參數(shù)簽名。
3) 如果方法的修飾符是private、static、final(static和final將在后續(xù)講解),或者是構造方法,那么編譯器將可以準確地知道應該調用哪個方法,我們將這種調用方式 稱為靜態(tài)綁定(static binding)。
與此對應的是,調用的方法依賴于對象的實際類型, 并在運行時實現(xiàn)動態(tài)綁。例如調用 func("hello"),編澤器將采用動態(tài)綁定的方式生成一條調用 func(String) 的指令。
上一篇:Java繼承中方法的覆蓋和重載
下一篇: 沒有了
初級會計職稱中級會計職稱經(jīng)濟師注冊會計師證券從業(yè)銀行從業(yè)會計實操統(tǒng)計師審計師高級會計師基金從業(yè)資格稅務師資產(chǎn)評估師國際內(nèi)審師ACCA/CAT價格鑒證師統(tǒng)計資格從業(yè)
一級建造師二級建造師消防工程師造價工程師土建職稱房地產(chǎn)經(jīng)紀人公路檢測工程師建筑八大員注冊建筑師二級造價師監(jiān)理工程師咨詢工程師房地產(chǎn)估價師 城鄉(xiāng)規(guī)劃師結構工程師巖土工程師安全工程師設備監(jiān)理師環(huán)境影響評價土地登記代理公路造價師公路監(jiān)理師化工工程師暖通工程師給排水工程師計量工程師
執(zhí)業(yè)藥師執(zhí)業(yè)醫(yī)師衛(wèi)生資格考試衛(wèi)生高級職稱護士資格證初級護師主管護師住院醫(yī)師臨床執(zhí)業(yè)醫(yī)師臨床助理醫(yī)師中醫(yī)執(zhí)業(yè)醫(yī)師中醫(yī)助理醫(yī)師中西醫(yī)醫(yī)師中西醫(yī)助理口腔執(zhí)業(yè)醫(yī)師口腔助理醫(yī)師公共衛(wèi)生醫(yī)師公衛(wèi)助理醫(yī)師實踐技能內(nèi)科主治醫(yī)師外科主治醫(yī)師中醫(yī)內(nèi)科主治兒科主治醫(yī)師婦產(chǎn)科醫(yī)師西藥士/師中藥士/師臨床檢驗技師臨床醫(yī)學理論中醫(yī)理論