工作小驛

          Ninja!

          BlogJava 首頁(yè) 新隨筆 聯(lián)系 聚合 管理
            103 Posts :: 0 Stories :: 36 Comments :: 0 Trackbacks
          override可以翻譯為覆蓋,從字面就可以知道,它是覆蓋了一個(gè)方法并且對(duì)其重寫(xiě),以求達(dá)到不同的作用。對(duì)我們來(lái)說(shuō)最熟悉的覆蓋就是對(duì)接口方法的實(shí)現(xiàn),在接口中一般只是對(duì)方法進(jìn)行了聲明,而我們?cè)趯?shí)現(xiàn)時(shí),就需要實(shí)現(xiàn)接口聲明的所有方法。除了這個(gè)典型的用法以外,我們?cè)诶^承中也可能會(huì)在子類(lèi)覆蓋父類(lèi)中的方法。在覆蓋要注意以下的幾點(diǎn):

          1、覆蓋的方法的標(biāo)志必須要和被覆蓋的方法的標(biāo)志完全匹配,才能達(dá)到覆蓋的效果;

          2、覆蓋的方法的返回值必須和被覆蓋的方法的返回一致;

          3、覆蓋的方法所拋出的異常必須和被覆蓋方法的所拋出的異常一致,或者是其子類(lèi);

          4、被覆蓋的方法不能為private,否則在其子類(lèi)中只是新定義了一個(gè)方法,并沒(méi)有對(duì)其進(jìn)行覆蓋。

          overload對(duì)我們來(lái)說(shuō)可能比較熟悉,可以翻譯為重載,它是指我們可以定義一些名稱(chēng)相同的方法,通過(guò)定義不同的輸入?yún)?shù)來(lái)區(qū)分這些方法,然后再調(diào)用時(shí),VM就會(huì)根據(jù)不同的參數(shù)樣式,來(lái)選擇合適的方法執(zhí)行。在使用重載要注意以下的幾點(diǎn):

          1、在使用重載時(shí)只能通過(guò)不同的參數(shù)樣式。例如,不同的參數(shù)類(lèi)型,不同的參數(shù)個(gè)數(shù),不同的參數(shù)順序(當(dāng)然,同一方法內(nèi)的幾個(gè)參數(shù)類(lèi)型必須不一樣,例如可以是fun(int, float), 但是不能為fun(int, int));

          2、不能通過(guò)訪問(wèn)權(quán)限、返回類(lèi)型、拋出的異常進(jìn)行重載;

          3、方法的異常類(lèi)型和數(shù)目不會(huì)對(duì)重載造成影響;

          4、對(duì)于繼承來(lái)說(shuō),如果某一方法在父類(lèi)中是訪問(wèn)權(quán)限是priavte,那么就不能在子類(lèi)對(duì)其進(jìn)行重載,如果定義的話,也只是定義了一個(gè)新方法,而不會(huì)達(dá)到重載的效果。

          下面是對(duì)override和overload的測(cè)試程序,其中注釋中的內(nèi)容都是會(huì)產(chǎn)生編譯錯(cuò)誤的代碼,我們將注釋去掉,看看在編譯時(shí)會(huì)產(chǎn)生什么效果。



          // 對(duì)overload測(cè)試的文件:OverloadTest.java
          public class OverloadTest {
          // 下面幾個(gè)方法用來(lái)驗(yàn)證可以通過(guò)定義不同的參數(shù)類(lèi)型和參數(shù)的數(shù)目進(jìn)行方法重載。
          public void fun(){
          System.out.println("method fun in OverloadTest, no parameter");
          }

          public void fun(float f) {
          System.out.println("method fun in OverloadTest, parameter type: float");
          }

          public void fun(int i){
          System.out.println("method fun in OverloadTest, parameter type: int");
          }

          public void fun(int i1, int i2) {
          System.out.println("method fun in OverloadTest, parameter type: int, int");
          }

          // 下面的兩個(gè)方法用來(lái)驗(yàn)證可以通過(guò)定義不同的參數(shù)順序進(jìn)行方法重載。
          // 需要注意:這里的參數(shù)肯定不是相同的類(lèi)型,否則的順序的先后就毫無(wú)意義。
          public void fun1(int i, float f) {
          System.out.println("method fun1 in OverloadTest,
          sequence of parameters is: int, float");
          }

          public void fun1(float f, int i) {
          System.out.println("method fun1 in OverloadTest,
          sequence of parameters is: float, int");
          }

          // 下面的兩個(gè)方法用來(lái)驗(yàn)證方法拋出的異常對(duì)于重載的影響.
          // 無(wú)論是異常的類(lèi)型還是異常的個(gè)數(shù)都不會(huì)對(duì)重載造成任何的影響。
          public void fun2() throws TestException {
          System.out.println("fun2 in OverloadTest, exception: TestException");
          }

          public void fun2(int i) throws TestException, TestException1 {
          System.out.println("fun2 in OverloadTest,
          exception: TestException, TestException1");
          }

          public void fun2(float f) throws Exception {
          System.out.println("fun2 in OverloadTest, exception: Exception");
          }

          // 不能通過(guò)拋出的異常類(lèi)型來(lái)重載fun方法。
          //public void fun(int i) throws Exception {
          // System.out.println("method fun in OverloadTest,
          parameter type: int, exception: Exception");
          //}

          // 不能通過(guò)返回值重載fun方法。
          //public boolean fun(int i) throws Exception {
          // System.out.println("method fun in OverloadTest,
          parameter type: int, exception: Exception, return: boolean");
          // return true;
          //}

          private void fun3() { }

          // 不能通過(guò)不同的訪問(wèn)權(quán)限進(jìn)行重載
          public void fun3() { }

          public static void main(String[] args) {
          // 這里只是定義了OverloadTest的實(shí)例,所以test不會(huì)調(diào)用
          // OverloadTest1中的方法。
          OverloadTest test = new OverloadTest1();
          // 這里定義了OverloadTest1的實(shí)例,因?yàn)镺verloadTest1是OverloadTest
          // 的子類(lèi),所以test1會(huì)調(diào)用OverloadTest中的方法。
          OverloadTest1 test1 = new OverloadTest1();

          try {
          int i = 1, j = 2, m = 3;

          // 這里不會(huì)調(diào)用OverloadTest1的fun方法
          // test.fun(i, m, j);
          test1.fun(i, j, m);
          test1.fun();
          // 這個(gè)調(diào)用不會(huì)執(zhí)行,因?yàn)閒un3()在OverloadTest中訪問(wèn)權(quán)限是priavte
          //test1.fun3();
          test1.fun3(i);
          } catch(Exception e) { }
          }
          }
          posted on 2007-09-18 14:49 王君 閱讀(304) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): J2SE
          主站蜘蛛池模板: 冷水江市| 安福县| 庄浪县| 满城县| 中宁县| 昆山市| 柯坪县| 黄浦区| 阳江市| 金昌市| 建昌县| 西乌珠穆沁旗| 宜兰县| 维西| 娄烦县| 桂林市| 大悟县| 海伦市| SHOW| 蓬溪县| 华坪县| 鄂州市| 古交市| 大化| 陆河县| 黄浦区| 乐至县| 西丰县| 水富县| 杭锦后旗| 临洮县| 余姚市| 泸州市| 武邑县| 鄂州市| 江安县| 石阡县| 库尔勒市| 娱乐| 耿马| 墨玉县|