黑马程序员1——关于Java的继承过程中成员变量与方法的隐藏与覆盖

最近几天在狂补Java的基础,在看到多态状态下继承时,出现纠结,于是把相关的思绪全部整理了一下,并编译验证。

 

 

先简述思想:

1、在继承过程中,父类成员变量一律只能被子类重写隐藏而不能重写覆盖。

2、在继承过程中,父类的静态方法一律只能被子类重写隐藏,实例方法一律被重写覆盖。

3、覆盖的方法没有加载进内存区。(这个是猜测,有待牛人考证)

4、静态方法与非静态方法之间不能重写,子类对象调用时会出现二义性。

[java] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. class Fu{  
  2.     int num =3;  
  3.       
  4.     void setnum(){  
  5.         num = 10;  
  6.     }  
  7. }  
  8. class Zi extends Fu{  
  9.     int num = 5;  
  10.     void setnum(){  
  11.         num = 20;  
  12.     }  
  13. }  
  14.   
  15. public class Test{  
  16.     public static void main(String[] args){  
  17.         Zi a = new Zi();  
  18.         a.setnum();  
  19.         System.out.println(a.num);  
  20.     }  
  21. }  

 

通过运行,我发现结果是20,这说明父类的setnum方法被重写覆盖了,没有加载进内存区。

 

[java] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. class Fu{  
  2.     static int num =3;  
  3.       
  4.     static void setnum(){  
  5.         num = 10;  
  6.     }  
  7. }  
  8. class Zi extends Fu{  
  9.     static int num = 5;  
  10.     static void setnum(){  
  11.         num = 20;  
  12.     }  
  13. }  
  14.   
  15. public class Test{  
  16.     public static void main(String[] args){  
  17.         Fu a = new Zi();  
  18.         a.setnum();  
  19.         System.out.println(a.num);  
  20.     }  
  21. }  

该代码运行结果为10,说明静态的方法是被隐藏而不是覆盖,把子类对象向上转型时,a变量无法访问子类的特有方法,但是num被改变,说明父类setnum方法没有被覆盖只是隐藏而已。

在加与不加static的情况下,将a对象调用setnum方法去掉后,运行结果都为3,说明成员变量在继承中只会被重写隐藏而不会覆盖。

posted @ 2016-12-06 14:25  天涯海角路  阅读(181)  评论(0)    收藏  举报