咱們知道,在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哈哈~ 是否是有點兒繞口,不要緊 咱們看一個實例
建立兩個父子類關係的類
- class Parent
- {
- public static String kind="javastudy.extendsstudy.parent";
- public static int age=50;
- public String name="Parent";
-
-
- public static String getKind()
- {
- System.out.println("parent的getKind()方法被調用了");
- return kind;
- }
-
-
- public static int getAge()
- {
- System.out.println("Parent的getAge()方法被調用了");
- return age;
- }
-
-
- public String getName()
- {
- System.out.println("Parent的getName()方法被調用了");
- return this.name;
- }
-
- }
-
-
- class Child extends Parent
- {
- public static String kind="javastudy.extendsstudy.child";
- public int age=25;
- public String name="child";
-
-
- public static String getKind()
- {
- System.out.println("child的getkind()方法被調用了");
- return kind;
- }
-
-
- public static String getParentKind()
- {
- return Parent.kind;
- }
-
-
- public String getName()
- {
- System.out.println("child的getName()被調用了");
- return this.name;
- }
-
-
- public String getParentName()
- {
- return super.name;
- }
-
- }
而後測試下
- class Test
- {
- public static void main(String[] args)
- {
- Child child=new Child();
- System.out.printf("子類名稱:%s,年齡:%d,包名:%s%n",child.name,child.age,child.kind);
-
-
-
- Parent parent=child;
-
- System.out.printf("轉換後的名稱:%s,年齡:%d,包名:%s%n",parent.name,parent.age,parent.kind);
-
-
- System.out.printf("子類訪問父類被隱藏的實例變量name:%s%n",child.getParentName());
-
-
- System.out.printf("子類訪問父類被隱藏的靜態變量kind:%s",child.getParentKind());
-
-
- child.getName();
-
-
-
- parent.getName();
-
-
- child.getKind();
-
-
- parent.getKind();
-
- }
- }
好了,看告終果後總結下吧
1.同名的實例方法被覆蓋 ,同名的靜態方法被隱藏 ,child類的getName實例方法覆蓋 了parent的getName實例方法,chind的getKind方法隱藏 了parent類的getKind方法
2.隱藏 和覆蓋 的區別在於,子類對象轉換成父類對象後,可以訪問父類被隱藏 的變量和方法,而不能訪問父類被覆蓋 的方法
3.若是須要訪問父類被隱藏 的實例變量,加上super就行了,好比訪問父類的name,寫上super.name就行了
本文不是教會你們重寫父類變量的,而是重點說明方法和變量的隱藏和覆蓋,這些個小知識點雖然在作項目的時候不怎麼會用到,可是必定要記住,否則的話不少錯誤會感到莫名其妙,還有就是SCJP的題庫裏這類題大大存在,因此本人以爲這些細小的知識仍是記住爲好