您的位置:首页 > 职场人生

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

2013-08-30 16:29 501 查看
 ------- android培训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,说明成员变量在继承中只会被重写隐藏而不会覆盖。


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: