亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

重載與覆蓋

2019-11-18 12:08:39
字體:
來源:轉載
供稿:網友

  通過前面的例子應當把握的最重要的一點是:方法匹配的依據是方法的名字和簽名的文本描述。下面我們為Sommelier類加入一些有關酒杯的方法:
  
  Glass fetchGlass(Wine wine) { ... }
  Glass fetchGlass(RedWine wine) { ... }
  Glass fetchGlass(WhiteWine wine) { ... }
  
  再來編譯下面的代碼:
  
  void example2() {
   Glass glass;
   Wine wine = sommelier.recommend("dUCk");
   if(wine instanceof Bordeaux)
    glass = sommelier.fetchGlass((Bordeaux) wine);
   else
    glass = sommelier.fetchGlass(wine);
  }
  
  這里有兩個fetchGlass調用:第一個調用的參數是一個Bordeaux對象,第二個調用的參數是一個Wine對象。java編譯器為這兩行代碼生成的指令分別是:
  
  invokevirtual Sommelier/fetchGlass (LRedWine;)LGlass;
  invokeVirtual Sommelier/fetchGlass (LWine;)LGlass;
  
  注重這兩者的區別是編譯時確定的,而不是運行時確定的。JVM用“L<類名稱>”這個符號表示一個類(就象前面例子中F的作用一樣),這兩個方法調用的輸入參數是一個Wine或RedWine,返回值是一個Glass。
  
  Sommelier類沒有提供輸入參數是Bordeaux的方法,但有一個方法的輸入參數是RedWine,所以第一個調用的方法簽名就用了輸入參數是RedWine的方法。至于第二個調用,編譯時只知道參數是一個Wine對象,所以編譯后的指令使用了輸入參數是Wine對象的方法。對于第二個調用,即使sommelier推薦的是一個Riesling對象,實際調用的也不會是fetchGlass(whiteWine),而是fetchGlass(wine),原因也一樣,被調用的方法總是一個簽名完全匹配的方法。
  
  在這個例子中,fetchGlass方法的不同定義是重載(Overload)關系,而不是覆蓋(Override)關系,因為這些fetchGlass方法的簽名互不相同。假如一個方法要覆蓋另一個方法,那么兩者必須有相同的參數和返回值類型。虛擬方法調用是在運行時查找特定的類型,只針對覆蓋的方法(擁有相同的簽名),而不是針對重載的方法(擁有不同的簽名)。重載方法的解析在編譯時完成,覆蓋方法的解析則在運行時進行。
  
  假如刪除fetchGlass(RedWine),不重新編譯,再運行example2,JVM將提示錯誤信息:java.lang.NoSuchMethodError: Sommelier.fetchGlass (LRedWine;)LGlass;。
  
  但是,刪除該方法之后,編譯example2仍然可以順利通過,不過這時兩個sommelier.fetchGlass調用將生成同樣的invokevirtual指令,即:invokevirtual Sommelier/fetchGlass (LWine;)LGlass;。
  
  假如再次放回fetchGlass(RedWine)方法,除非重新編譯example2,否則fetchGlass(RedWine)不會被調用,JVM將使用fetchGlass(wine)。當傳入的對象是一個Riesling時,由于同樣的原因,它也不會使用fetchGlass(WhiteWine):因為編譯時根本不能確定具體的對象。,所以選用了一個更一般化的方法。
  
  在“invokevirtual Wine/temperature ()F”這個指令中,JVM沒有嚴格堅持使用Wine對象,而是自動尋找實際實現了temperature方法的對象;但在“invokevirtual Sommelier/fetchGlass (LRedWine;)LGlass;”指令中,JVM卻很在乎RedWine。這是為什么呢?因為第一個指令中,Wine不屬于方法簽名,只是用于調用之前的類型檢查;而在第二個指令中,RedWine屬于方法簽名的一部分,JVM必須根據方法簽名和方法名稱來尋找要調用的方法。
  
  假設我們為Sommelier類加入了一個fetchGlass方法:
  
  class RedWineGlass extends Glass { ... }
  RedWineGlass fetchGlass(RedWine wine) { ... }
  
  再來看原來編譯的example2,它用“invokevirtual Sommelier/fetchGlass (LRedWine;)LGlass;”指令調用fetchGlass方法。新加入的方法不會自動起作用,因為RedWineGlass和Glass是兩種不同的類型。但是,假如我們重新編譯example2,調用Bordeaux的例子將變成“invokevirtual Sommelier/fetchGlass (LRedWine;)LRedWineGlass;”。
  
  綜上所述,我們可以總結出如下Java二進制兼容性的重要原則:
  
 ?、?編譯時,Java編譯器選擇最匹配的方法簽名。
  
  ⑵ 運行時,JVM查找精確匹配的方法名稱和簽名。相似的名稱和簽名將被忽略。
  
 ?、?假如找不到適當的方法,JVM拋出異常,且不裝入指定的類。
  
 ?、?重載的方法在編譯時處理,覆蓋的方法在運行時處理。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产日韩欧美91| 久久久亚洲精选| 亚洲精品国产精品国自产观看浪潮| 91夜夜揉人人捏人人添红杏| 北条麻妃在线一区二区| 最近2019中文字幕第三页视频| 亚洲自拍偷拍福利| 4388成人网| 另类专区欧美制服同性| 亚洲无av在线中文字幕| 日本免费久久高清视频| 久久夜色撩人精品| 91在线视频成人| 欧美黄网免费在线观看| 欧美激情aaaa| 黑人巨大精品欧美一区二区| 蜜臀久久99精品久久久无需会员| 中文字幕日韩综合av| 日韩在线观看免费网站| 亚洲人午夜精品免费| 欧美成人在线网站| 欧美日韩日本国产| 日韩精品免费在线视频观看| 久久久在线视频| 精品久久久免费| 久久久久久久久国产| 欧美黄色成人网| 国产精品aaaa| 国产97在线观看| 亚洲aⅴ男人的天堂在线观看| 91精品视频网站| 亚洲视频axxx| 亚洲欧美日韩高清| 亚洲一区二区黄| 姬川优奈aav一区二区| 国产婷婷97碰碰久久人人蜜臀| 黑丝美女久久久| 韩国三级日本三级少妇99| 精品久久久91| 在线国产精品视频| 国产香蕉精品视频一区二区三区| 欧美天天综合色影久久精品| 姬川优奈aav一区二区| 亚洲性69xxxbbb| 欧美大片在线免费观看| 激情懂色av一区av二区av| 日韩国产高清污视频在线观看| 亚洲新声在线观看| 色噜噜亚洲精品中文字幕| 欧美一区视频在线| 狠狠久久五月精品中文字幕| 久久久久久69| 国产精品网站入口| 国产亚洲日本欧美韩国| 激情av一区二区| 亚洲精品国精品久久99热| www.精品av.com| 日本午夜人人精品| 性夜试看影院91社区| 97人人爽人人喊人人模波多| www.久久久久久.com| 欧美在线视频在线播放完整版免费观看| 91九色精品视频| 国产欧美久久一区二区| 欧美国产视频一区二区| 中文字幕在线精品| 亚洲男人7777| 国产日韩中文在线| 精品欧美激情精品一区| 欧美黑人一级爽快片淫片高清| 欧美高清视频一区二区| 国语自产精品视频在线看| 色综合久久精品亚洲国产| 国产精品久久激情| 91免费国产视频| 久久久av亚洲男天堂| 亚洲欧洲日产国产网站| 欧美大全免费观看电视剧大泉洋| 亚洲电影免费观看高清完整版| 色爱av美腿丝袜综合粉嫩av| 国内精品久久久久久影视8| 久久久久久com| 亚洲网站视频福利| 超碰97人人做人人爱少妇| 91国内免费在线视频| www.日韩不卡电影av| 精品中文字幕久久久久久| 欧美日韩第一视频| 韩国美女主播一区| 欧美成aaa人片免费看| 欧美视频在线观看免费网址| 亚洲香蕉伊综合在人在线视看| 高清一区二区三区四区五区| 欧美日韩免费在线观看| 国产精品自产拍在线观看| 国产精品人成电影在线观看| 亚洲最大福利网站| 久久亚洲综合国产精品99麻豆精品福利| 奇门遁甲1982国语版免费观看高清| 欧美丝袜一区二区| 国内精品在线一区| 亚洲成成品网站| 国产精品露脸av在线| 久久久国产影院| 中文字幕一精品亚洲无线一区| 国产精品一区二区在线| 国产九九精品视频| 欧美在线性爱视频| 97超碰国产精品女人人人爽| 欧美理论电影在线观看| 欧美性受xxx| 国产精品久久久久久久久久久久| 久久艳片www.17c.com| 亚洲人成电影在线观看天堂色| 少妇精69xxtheporn| 亚洲激情在线观看视频免费| 欧美日韩中文在线| 国产在线久久久| 国产精品视频中文字幕91| 欧美孕妇性xx| 亚洲第一视频网| 精品国产一区二区三区久久狼5月| 2019中文字幕在线免费观看| 精品亚洲一区二区三区| 国产成人精彩在线视频九色| 国产在线拍揄自揄视频不卡99| 超在线视频97| 日韩亚洲一区二区| 日韩成人中文字幕| 欧美日韩国产成人在线| 日韩av免费在线看| 亚洲va码欧洲m码| 欧洲午夜精品久久久| 日韩欧美在线视频观看| 欧美国产日韩xxxxx| 国产精品com| 国产一区私人高清影院| 欧美性猛交xxxx| 欧洲成人在线观看| 欧美极品少妇xxxxⅹ免费视频| 亚洲黄色成人网| 亚洲最大成人免费视频| 亚洲片在线观看| 538国产精品一区二区免费视频| 91精品国产高清| 国产一区二区色| 精品久久久久久久久国产字幕| 亚洲国产日韩欧美在线动漫| 色中色综合影院手机版在线观看| 久久精品99久久久久久久久| 欧美性猛交xxxx免费看久久久| 欧美大全免费观看电视剧大泉洋| 欧美亚洲激情在线| 国产成人综合精品| 欧美最猛性xxxxx(亚洲精品)| 日韩一级黄色av| 免费av在线一区| 亚洲精品网站在线播放gif| 在线播放国产一区中文字幕剧情欧美| 亚洲iv一区二区三区| 国产做受高潮69| 51ⅴ精品国产91久久久久久| 亚洲韩国日本中文字幕| 日韩国产精品亚洲а∨天堂免|