<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    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 飛豬一號 閱讀(1227) 評論(0)  編輯  收藏


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


    網站導航:
     

    導航

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

    統計

    常用鏈接

    留言簿

    隨筆檔案

    友情鏈接

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 在线天堂免费观看.WWW| 免费人成在线观看网站| 免费萌白酱国产一区二区| 亚洲色在线无码国产精品不卡| 在线天堂免费观看.WWW| 亚洲熟妇成人精品一区| 免费看片A级毛片免费看| 18禁亚洲深夜福利人口| 亚洲人午夜射精精品日韩| a级毛片在线免费| 蜜芽亚洲av无码精品色午夜| 久久久久久曰本AV免费免费| 国产 亚洲 中文在线 字幕 | 免费人成在线观看69式小视频| 亚洲国产亚洲片在线观看播放| 在线观看免费人成视频| 亚洲AV无码一区二区三区久久精品 | 免费日本一区二区| 亚洲精品不卡视频| 永久免费av无码网站大全| 一级毛片在播放免费| 国产精品亚洲片在线观看不卡 | 思思久久99热免费精品6| 亚洲爆乳无码一区二区三区| 久久午夜伦鲁片免费无码| 亚洲成年网站在线观看| 免费中文字幕在线观看| 久久大香伊焦在人线免费| 久久久国产亚洲精品| 国产日产亚洲系列最新| 亚洲成人免费网址| 窝窝影视午夜看片免费| 亚洲首页在线观看| 亚洲乱码日产精品a级毛片久久| 久久国产乱子伦精品免费不卡| 亚洲Av无码一区二区二三区| 国产免费拔擦拔擦8x| 午夜无码A级毛片免费视频| 亚洲午夜无码久久久久小说| 在线观看午夜亚洲一区| 在线成人a毛片免费播放|