JAVA中方法和變量在繼承中的覆蓋和隱藏

出處:http://renyanwei.iteye.com/blog/258304java

 

咱們知道,在JAVA中,子類能夠繼承父類,若是子類聲明的方法與父類有重名的狀況怎麼辦,大夥兒都知道要是重寫,可是實際上這又分爲兩種 狀況,就是方法和變量在繼承時的覆蓋和隱藏問題,這些概念性的東西看似無聊,可是在面試或者是SCJP認證題中圍繞這些是會常常碰到的,因此這裏來討論下面試

 

首先咱們來看幾個概念測試

隱藏 :child隱藏了parent的變量和方法,那麼,child不能訪問parent被隱藏的變量或者方法,可是,講B轉換成A中,能夠訪問A被隱藏的變量或者方法this

覆蓋 :child覆蓋了parent的變量或者方法,那麼,child不能訪問parent被覆蓋的變量或者方法,將child轉換成parent後一樣不能訪問parent被覆蓋的變量或者方法spa

 

首先看一下JAVA中方法和變量在繼承時的覆蓋和隱藏規則對象

1.父類的實例變量和靜態變量能被子類的同名變量隱藏 blog

2.父類的靜態方法被子類的同名靜態方法隱藏 繼承

3.父類的實例方法被子類的同名實例變量覆蓋 get

 

還有幾點須要注意的是string

1.不能用子類的靜態方法隱藏 父類中一樣標示(也就是返回值 名字 參數都同樣)的實例方法

2.不能用子類的實例方法覆蓋 父類中一樣標示的靜態方法

3.這點兒請注意,就是變量只會被隱藏 不會被覆蓋 ,不管他是實例變量仍是靜態變量,並且,子類的靜態變量能夠隱藏 父類的實例變量,子類的實例變量能夠隱藏 父類的靜態變量

 

O(∩_∩)O哈哈~ 是否是有點兒繞口,不要緊 咱們看一個實例

建立兩個父子類關係的類

Java代碼   收藏代碼
  1. //父類  
  2. class Parent  
  3. {  
  4.     public static String kind="javastudy.extendsstudy.parent";  
  5.     public static int age=50;  
  6.     public String name="Parent";  
  7.   
  8.     //靜態方法,返回包名  
  9.     public static String getKind()  
  10.     {  
  11.         System.out.println("parent的getKind()方法被調用了");  
  12.         return kind;  
  13.     }  
  14.   
  15.     //靜態方法,返回年齡  
  16.     public static int getAge()  
  17.     {  
  18.         System.out.println("Parent的getAge()方法被調用了");  
  19.         return age;  
  20.     }  
  21.   
  22.     //實例方法,返回姓名  
  23.     public String getName()  
  24.     {  
  25.         System.out.println("Parent的getName()方法被調用了");  
  26.         return this.name;  
  27.     }  
  28.   
  29. }  
  30.   
  31.   
  32. //子類  
  33. class Child extends Parent  
  34. {  
  35.     public static String kind="javastudy.extendsstudy.child";  
  36.     public int age=25;  
  37.     public String name="child";  
  38.   
  39.     //隱藏父類靜態方法  
  40.     public static String getKind()  
  41.     {  
  42.         System.out.println("child的getkind()方法被調用了");  
  43.         return kind;  
  44.     }  
  45.       
  46.     //獲取父類包名  
  47.     public static String getParentKind()  
  48.     {  
  49.         return Parent.kind;  
  50.     }  
  51.       
  52.     //覆蓋父類實例方法  
  53.     public String getName()  
  54.     {  
  55.         System.out.println("child的getName()被調用了");  
  56.         return this.name;  
  57.     }  
  58.       
  59.     //獲取父類名稱  
  60.     public String getParentName()  
  61.     {  
  62.         return super.name;  
  63.     }  
  64.     /* 
  65.      *錯誤,實例方法不能覆蓋父類的靜態方法 
  66.     public int getAge() 
  67.     { 
  68.         return this.age; 
  69.     } 
  70.     */  
  71. }  

 而後測試下

Java代碼   收藏代碼
  1. class Test   
  2. {  
  3.     public static void main(String[] args)   
  4.     {  
  5.         Child child=new Child();  
  6.         System.out.printf("子類名稱:%s,年齡:%d,包名:%s%n",child.name,child.age,child.kind);  
  7.         //輸出:子類名稱:child,年齡:25,包:javastudy.extendsstudy.child  
  8.   
  9.         //把child轉換成parent對象  
  10.         Parent parent=child;  
  11.   
  12.         System.out.printf("轉換後的名稱:%s,年齡:%d,包名:%s%n",parent.name,parent.age,parent.kind);  
  13.         //輸出:轉換後的名稱:Parent,年齡:50,包:javastudy.extendsstudy.parent  
  14.   
  15.         System.out.printf("子類訪問父類被隱藏的實例變量name:%s%n",child.getParentName());  
  16.         //輸出:子類訪問父類被隱藏的實例變量name:Parent  
  17.           
  18.         System.out.printf("子類訪問父類被隱藏的靜態變量kind:%s",child.getParentKind());  
  19.         //輸出:子類訪問父類被隱藏的靜態變量kind:javastudy.extendsstudy.parent  
  20.   
  21.         child.getName();  
  22.         //輸出:child的getName()被調用了  
  23.   
  24.         //**************注意看這個方法,返回的仍是子類的getName  
  25.         parent.getName();  
  26.         //輸出:child的getName()被調用了  
  27.   
  28.         child.getKind();  
  29.         //輸出:child的getkind()方法被調用了  
  30.   
  31.         parent.getKind();  
  32.         //輸出:parent的getKind()方法被調用了  
  33.     }  
  34. }  

 好了,看告終果後總結下吧

1.同名的實例方法被覆蓋 ,同名的靜態方法被隱藏 ,child類的getName實例方法覆蓋 了parent的getName實例方法,chind的getKind方法隱藏 了parent類的getKind方法

2.隱藏覆蓋 的區別在於,子類對象轉換成父類對象後,可以訪問父類被隱藏 的變量和方法,而不能訪問父類被覆蓋 的方法

3.若是須要訪問父類被隱藏 的實例變量,加上super就行了,好比訪問父類的name,寫上super.name就行了

 

本文不是教會你們重寫父類變量的,而是重點說明方法和變量的隱藏和覆蓋,這些個小知識點雖然在作項目的時候不怎麼會用到,可是必定要記住,否則的話不少錯誤會感到莫名其妙,還有就是SCJP的題庫裏這類題大大存在,因此本人以爲這些細小的知識仍是記住爲好

相關文章
相關標籤/搜索