Java類成員(成員變量和方法)的覆蓋與隱藏概括

  Java類成員(成員變量和方法)的覆蓋與隱藏概括

之前就知道重寫override和重載overload的區別,平時也是逮着用就是了,Eclipse報錯再說。java

最近看一本書裏面出現了重寫、替換、覆蓋、置換、隱藏、重載,簡直亂得不行,概括整理一下。數組

 

從全局來看,java只有重寫、隱藏、重載3種,具體概括以下:ide

基本概念:post

方法簽名:方法名+參數列表(參數類型、個數、順序)。
=================================【重寫】=================================spa

某些書又叫覆蓋、替換、置換。本文統一叫重寫。.net

只有實例方法能夠被重寫!重寫後的方法必須仍爲實例方法!(實例方法------重寫------>實例方法)
成員變量和靜態方法都不能被重寫,只能被隱藏。對象

重寫實例方法:超類Parent中有實例方法A,子類child定義了與A「相同簽名和子集返回類型」的實例方法B,子類對象ChildObj只能調用本身的實例方法B。
                              即便將子類對象ChildObj轉換爲超類對象ParentObj,ParentObj依然只能調用重寫後的實例方法B!
                              (超類對象ParentObj中的實例方法A已經被實例方法B覆蓋了)

       
blog

重寫的語法規則以下:
(1)方法簽名必須相同(參數類型、個數、順序);
(2)對返回類型有要求,分2種狀況:
     a.被重寫方法的返回類型是基本類型:重寫方法的返回類型必須「相同」。
                基本類型包括了(byte,short,int,long,float,double,char,boolean,其實還包括一個void類型),但要注意返回類型是封裝類時屬於下面的狀況b。
     b.被重寫方法的返回類型是引用類型:重寫方法的返回類型應「相同」或是其「子類型」;
                引用類型包括了數組、string等一切非基本類型的類型(即類類型)。
(3)重寫方法的訪問權限不能小於被重寫方法的訪問權限,能夠更普遍。如被重寫方法是包訪問權限,重寫方法是public訪問權限。
     重寫方法能夠改變其它的方法修飾符,如final、synchronized、native、strictfp。
     無論被重寫方法中有無final修飾的參數,重寫方法均可以增長、保留、去掉這個參數的final修飾符(參數修飾符不屬於方法簽名)。
(4)重寫方法拋出的異常範圍不能大於被重寫方法拋出的異常的範圍(也能夠不拋出異常)。
(5)不能重寫final方法。(final修飾符存在的意義就是防止任何子類重寫該方法)
(6)不能重寫static靜態方法。(形式上能夠寫,但本質上不是重寫,屬於下面要講的隱藏)
(7)若是一個方法不能被繼承,則不能重寫它。或者說:只有當方法能夠被訪問時才能夠被重寫。
     典型的就是超類的private方法。繼承

對於(3)須要注意:
1.重寫override對返回類型有要求,而重載overload對返回類型沒有要求。
   重載能夠改變返回類型。由於編譯器經過對方法簽名的識別便可靜態編譯出不一樣的方法。這也是java中重載與重寫的區別之一。
2.嚴格來講,重寫屬於多態,由於是動態綁定(或稱爲動態聯編),而重載是靜態綁定,編譯時便可肯定。ip

 

=================================【隱藏】=================================

隱藏與覆蓋在形式上極其相似(語法規則),但有着本質的區別。

只有成員變量(無論是否是靜態)和靜態方法能夠被隱藏。

----------------------------成員變量------------------------

隱藏成員變量:超類Parent中有成員變量A,子類Child定義了與A同名的成員變量B,子類對象ChildObj調用的是本身的成員變量B。
                              若是把子類對象ChildObj轉換爲超類對象ParentObj,ParentObj調用的是超類的成員變量A!
                              注:1.隱藏成員變量時,只要同名便可,能夠更改變量類型(不管基本類型仍是隱藏類型)
                                       2.不能隱藏超類中的private成員變量,換句話說,只能隱藏能夠訪問的成員變量。
                                       3.隱藏超類成員變量A時,能夠下降或提升子類成員變量B的訪問權限,只要A不是private
                                       4.隱藏成員變量與是否靜態無關!靜態變量能夠隱藏實例變量,實例變量也能夠隱藏靜態變量
                                       5.能夠隱藏超類中的final成員變量。

 

----------------------------靜態方法------------------------

隱藏後的方法必須仍爲靜態方法!(靜態方法------隱藏------>靜態方法)

隱藏靜態方法:超類Parent有靜態方法A,子類Child定義了與A「相同簽名和子集返回類型」的靜態方法B,子類對象ChildObj調用的是本身的靜態方法B。
                              若是把子類對象ChildObj轉換爲超類對象ParentObj,ParentObj調用的是超類的靜態方法A!

隱藏超類靜態方法的語法規則與重寫實例方法的規則幾乎徹底相同,只須要修改第(6)條爲:(6)不能隱藏實例方法。。

示例代碼:

 

[java]  view plain copy
 
  1. class Animal {  
  2.     char hairColor='B';  
  3.     int legNumber=2;  
  4.     static boolean isHuman=true;  
  5.     public static void testClassMethod() {  
  6.         System.out.println("The class" + " method in Animal.");  
  7.     }  
  8.   
  9.     public void testInstanceMethod() {  
  10.         System.out.println("The instance " + " method in Animal.");  
  11.     }  
  12. }  
  13.   
  14. public class Cat extends Animal {  
  15.     static int hairColor=1;  
  16.     char legNumber='A';  
  17.     double isHuman=3.1415926E5;   
  18.     public static void testClassMethod() {  
  19.         System.out.println("The class method" + " in Cat.");  
  20.     }  
  21.   
  22.     public void testInstanceMethod() {  
  23.         System.out.println("The instance method" + " in Cat.");  
  24.     }  
  25.   
  26.     public static void main(String[] args) {  
  27.         System.out.println("========child class=========");  
  28.         Cat myCat = new Cat();  
  29.         System.out.println("myCat.hairColor="+myCat.hairColor);  
  30.         System.out.println("myCat.legNumber="+myCat.legNumber);  
  31.         System.out.println("myCat.isHuman="+myCat.isHuman);  
  32.         myCat.testClassMethod();  
  33.         myCat.testInstanceMethod();  
  34.         System.out.println("========child class ---> parent class=========");  
  35.         Animal myAnimal = myCat;  
  36.         System.out.println("========parent class=========");  
  37.         System.out.println("myAnimal.hairColor="+myAnimal.hairColor);  
  38.         System.out.println("myAnimal.legNumber="+myAnimal.legNumber);  
  39.         System.out.println("myAnimal.isHuman="+myAnimal.isHuman);         
  40.         myAnimal.testClassMethod();  
  41.         myAnimal.testInstanceMethod();  
  42.     }  
  43. }  
輸出結果:

 

 

[java]  view plain copy
 
  1. ========child class=========  
  2. myCat.hairColor=1  
  3. myCat.legNumber=A  
  4. myCat.isHuman=314159.26  
  5. The class method in Cat.  
  6. The instance method in Cat.  
  7. ========child class ---> parent class=========  
  8. ========parent class=========  
  9. myAnimal.hairColor=B  
  10. myAnimal.legNumber=2  
  11. myAnimal.isHuman=true  
  12. The class method in Animal.  
  13. The instance method in Cat.  
相關文章
相關標籤/搜索