黑马程序员1——关于Java的继承过程中成员变量与方法的隐藏与覆盖
最近几天在狂补Java的基础,在看到多态状态下继承时,出现纠结,于是把相关的思绪全部整理了一下,并编译验证。
先简述思想:
1、在继承过程中,父类成员变量一律只能被子类重写隐藏而不能重写覆盖。
2、在继承过程中,父类的静态方法一律只能被子类重写隐藏,实例方法一律被重写覆盖。
3、覆盖的方法没有加载进内存区。(这个是猜测,有待牛人考证)
4、静态方法与非静态方法之间不能重写,子类对象调用时会出现二义性。
- class Fu{
- int num =3;
- void setnum(){
- num = 10;
- }
- }
- class Zi extends Fu{
- int num = 5;
- void setnum(){
- num = 20;
- }
- }
- public class Test{
- public static void main(String[] args){
- Zi a = new Zi();
- a.setnum();
- System.out.println(a.num);
- }
- }
通过运行,我发现结果是20,这说明父类的setnum方法被重写覆盖了,没有加载进内存区。
- class Fu{
- static int num =3;
- static void setnum(){
- num = 10;
- }
- }
- class Zi extends Fu{
- static int num = 5;
- static void setnum(){
- num = 20;
- }
- }
- public class Test{
- public static void main(String[] args){
- Fu a = new Zi();
- a.setnum();
- System.out.println(a.num);
- }
- }
该代码运行结果为10,说明静态的方法是被隐藏而不是覆盖,把子类对象向上转型时,a变量无法访问子类的特有方法,但是num被改变,说明父类setnum方法没有被覆盖只是隐藏而已。
在加与不加static的情况下,将a对象调用setnum方法去掉后,运行结果都为3,说明成员变量在继承中只会被重写隐藏而不会覆盖。

浙公网安备 33010602011771号