教育行業(yè)A股IPO第一股(股票代碼 003032)

全國(guó)咨詢/投訴熱線:400-618-4000

Java培訓(xùn):重載和覆蓋有什么區(qū)別?

更新時(shí)間:2023年02月17日14時(shí)59分 來(lái)源:傳智教育 瀏覽次數(shù):

好口碑IT培訓(xùn)

  重載(overload)和覆蓋(override)是Java多態(tài)性的兩種同表現(xiàn)方式。細(xì)節(jié)在于,重載是說(shuō)在一個(gè)類里面定義了多個(gè)同名的方法,這些方法的參數(shù)類型與個(gè)數(shù)的不盡相同。重載可以理解成是多態(tài)性的一種表現(xiàn)。我們?cè)谑褂弥剌d的時(shí)候,還應(yīng)該注意以下幾個(gè)點(diǎn):

  1)重載是通過(guò)不同的方法參數(shù)來(lái)區(qū)分的,比方說(shuō)不同的參數(shù)類型、不同的參數(shù)個(gè)數(shù)以及不同的參數(shù)順序。

  2)不可以通過(guò)方法的返回值類型、拋出的異常類型以及訪問(wèn)權(quán)限來(lái)進(jìn)行重載。

  3)拿繼承舉例,如果基類的方法的訪問(wèn)權(quán)限為private,那么就不能在派生類對(duì)其重載;如果派生類也定義了一個(gè)同名的函數(shù),這相當(dāng)于一個(gè)新的方法,并不能達(dá)到重載的效果。

  覆蓋指的是派生類函數(shù)覆蓋基類函數(shù)。覆蓋一個(gè)方法并對(duì)其重寫(xiě),來(lái)達(dá)到不同的作用。在使用覆蓋時(shí)一般需要注意以下幾點(diǎn):

  1)派生類中的覆蓋方法的返回值必須和基類中被覆蓋白方法的返回值相同。

  2)派生類中的覆蓋方法必須要和基類中被覆蓋的方法有相同的函數(shù)名和參數(shù)。

  3)派生類中的覆蓋方法所拋出的異常必須和基類(或是其子類)中被覆蓋的方法所拋出的異常一致。

  4)基類中被覆蓋的方法不能為private,否則其子類只是定義了一個(gè)方法,并沒(méi)有對(duì)齊覆蓋。

  重載與覆蓋主要的區(qū)別是什么?

  1)重載屬于水平關(guān)系,也即同一個(gè)類中方法之間的關(guān)系;覆蓋屬于垂直關(guān)系,是父類和子類之間的關(guān)系。

  2)重載是多個(gè)方法之間的關(guān)系;覆蓋只能由一對(duì)方法或者只由一個(gè)方法產(chǎn)生關(guān)系。

  3)重載要求參數(shù)列表可以是不同的;覆蓋要求參數(shù)列表必須相同。

  4)重載關(guān)系是根據(jù)調(diào)用時(shí)的實(shí)參表與形參表來(lái)選擇方法體的;而覆蓋關(guān)系中,調(diào)用方法體時(shí)根據(jù)對(duì)象的類型(對(duì)象對(duì)應(yīng)存儲(chǔ)空間類型)來(lái)決定的。

  常見(jiàn)筆試題:

  如下代碼的運(yùn)行結(jié)果是什么?

class Super {
      public int f() {
           return 1;
      }
}
    public class SubClass extends Super {
         public float f() {
            return 2f;
         }
         public static void main(String[] args) {
              Super s = new SubClass;
              System.out.println(s.f());
         }
}

  答案:編譯錯(cuò)誤。因?yàn)楹瘮?shù)是不能以返回值來(lái)區(qū)分的,雖然父類與子類中的函數(shù)有著不同返回值,但是它們有著相同的函數(shù)名,因此,編譯器無(wú)法區(qū)分。

0 分享到:
和我們?cè)诰€交談!