jialisoftw

          overload與override的區別

          overload與override的區別:
           
          java多態之Override :
          Override(重寫)是子類與父類的一種多態性體現。 
          Override允許子類改變父類的一些行為。 
          為什么需要Override:當父類不滿足子類的一些要求時我們就需要子類對父類的一些行為進行重寫。 
          例如:某公司里的員工的電話號碼不允許對外公開,而銷售人員(員工)的電話號碼則需要對外公開。 
          這時我們就可以這樣做: 
          Java代碼  
          public class Employee {        
             private String mobile;        
             public Employee(String mobile) {   
                  this.mobile = mobile;   
              }        
             protected String showMess(){   
                 return "電話號碼:"+mobile;   
             }   
          }  
          public class Employee {  
                  private String mobile; 
                  public Employee(String mobile) {
                          this.mobile = mobile;
                  }
                  protected String showMess(){
                          return "電話號碼:"+mobile;
                  }
          }
          員工類的showMess方法是protected的,所以位于其他包的對象是訪問不到的。
          然后定義一個銷售人員的類(Sales),并繼承Employee類
           
          Java代碼  
          public class Sales extends Employee{   
                 //子類除了具有父類的一些屬性,也可以有自己的一些屬性   
            private String msn;   
             public Sales(String mobile,String msn) {   
                 super(mobile);   
                 this.msn = msn;   
             }     
              @Override  
             public String showMess() {   
                return super.showMess()+"==msn:"+this.msn;   
             }   
          }  
          public class Sales extends Employee{   
                  //子類除了具有父類的一些屬性,也可以有自己的一些屬性
                  private String msn;
           
                  public Sales(String mobile,String msn) {
                          super(mobile);
                          this.msn = msn;
                  }
                  @Override
                  public String showMess() {
                          return super.showMess()+"==msn:"+this.msn;
                  }
          }
          注意這時被覆蓋的showMess方法的訪問級別是public,可以被任何其他對象訪問到。
          關于Override有幾點要注意的地方: 
          1.被覆蓋方法的訪問控制級別可以不一樣。 
          例如上例父類的showMess方法的訪問級別為protected的,而子類覆蓋的showMess方法訪問級別則為public的。
          但子類的訪問級別必須要高于父類被覆蓋方法的訪問級別,如果父類是public的而子類是protected的則是錯誤的。
          2.方法被定義為private或static或final的則不能被覆蓋。
          3.方法的返回類型:子類的返回類型可以是更具體的對象,例如可以將Employee類的返回類型改為Object也正確。而倒過來則錯誤。
          4.在方法調用時先會在子類中找覆蓋的方法,如果子類中沒有則會在父類中去找。
           
          Java代碼  
          public class Parent {          
              private int num(int i,int j){   
                 return i+j;   
              }         
            public static void main(String[] args) {   
                Parent p = new Child();   
                 System.out.println(p.num(1, 2));   
             }   
          }   
          class Child extends Parent{        
             public int num(int x,int y){   
                  return x-y;   
             }   
          }  
          public class Parent {
                  private int num(int i,int j){
                          return i+j;
                  } 
                  public static void main(String[] args) {
                          Parent p = new Child();
                          System.out.println(p.num(1, 2));
                  }
          }
          class Child extends Parent{    
                  public int num(int x,int y){
                          return x-y;
                  }
          }
          這段代碼的執行結果為什么呢?如果你回答-1則錯了,正確答案是3。 
          為什么呢?因為父類的num方法是private的,所以不能被覆蓋,所以子類的num方法不是一種Override,因此在子類找不到被覆蓋的num方法就會執行父類的num方法。所以結果輸出為3.
           
          Java代碼  
          public class Parent {          
              public int test(){   
                          //執行子類的num方法   
                  return num(1,2);   
          }          
              protected int num(int i,int j){   
                  return i+j;   
             }          
              public static void main(String[] args) {   
                  Parent p = new Child();   
                  System.out.println(p.test());   
          }     
          }   
          class Child extends Parent{          
              public int num(int x,int y){   
                  return x-y;   
              }   
          }  
          public class Parent {
                  
                  public int test(){
                          //執行子類的num方法
                          return num(1,2);
                  } 
                  protected int num(int i,int j){
                          return i+j;
                  } 
                  public static void main(String[] args) {
                          Parent p = new Child();
                          System.out.println(p.test());
                  }
          }
          class Child extends Parent{
                  
                  public int num(int x,int y){
                          return x-y;
                  }
          }
          那么這段代碼的執行結果是-1,因為父類test方法調用的是子類的num方法。
           java overload的原則 :
          在java中overload要遵循兩個原則:準確性和唯一性
           
          例一:
          public class TestOverLoad
          {
          public static void main(String[] args)
          {
             Test test = new Test();
             test.print(null);  
          }
          class Test
          {
          public void print(String some)
          {
             System.out.println("String version print");
          }
          public void print(Object some)
          {
             System.out.println("Object version print"); 
          }
          }
          在這個程序中,   test.print(null)中的null即是String又是Object,那么要執行那個函數呢?結果是它執行了 public void print(String some),原因就是準確性原則,String繼承自Object.在java看來,在這個例子中說null是String類型的比說null是Object類型的更為準確.
           
          例二:
          public class TestOverLoad
          {
          public static void main(String[] args)
          {
             Test test = new Test();
             test.print(null);  
          }
          class Test
          {
          public void print(String some)
          {
             System.out.println("String version print");
          }
          public void print(Object some)
          {
             System.out.println("Object version print"); 
          }
           
          public void print(StringBuffer some)
          {
             System.out.println("StringBuffer version print"); 
          }
          }
          在該例中,Test類多了一個函數,然而在編譯時出現了錯誤.原因是該例違反了overload的唯一性原則
           
          .String和StringBuffer之間不存在繼承關系,因此不能說null屬于它們兩個中的那個類更準確,于是程序在執行時就會不知道該調用public void print(String some),還是該調用 public void print(StringBuffer some).
          原文地址:http://www.software8.co/wzjs/java/1261.html

          posted on 2012-11-14 10:23 飛豬一號 閱讀(1229) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           

          導航

          <2012年11月>
          28293031123
          45678910
          11121314151617
          18192021222324
          2526272829301
          2345678

          統計

          常用鏈接

          留言簿

          隨筆檔案

          友情鏈接

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 中宁县| 肃北| 彭泽县| 博野县| 特克斯县| 民丰县| 资兴市| 曲靖市| 丰原市| 兰坪| 五常市| 乡宁县| 周宁县| 东平县| 高淳县| 明溪县| 东丰县| 道真| 新竹县| 安塞县| 东兰县| 海阳市| 朝阳区| 衡南县| 汉川市| 锡林郭勒盟| 桂阳县| 温宿县| 上犹县| 大姚县| 厦门市| 蓝山县| 板桥市| 启东市| 进贤县| 汨罗市| 龙川县| 江津市| 博白县| 都江堰市| 呈贡县|