您的位置:首页 > 编程语言 > Java开发

如何理解Java中的隐藏与覆盖

2011-09-17 22:49 176 查看
例子:

class Student1{

int math = 70;

static int computer = 80;

int english = 65;

public Student1(){

study();

exercise();

}

public void study(){

System.out.println("Student.study:每位学生都在认真学习");

}

public static void exercise(){

System.out.println("Student.exercise:所有学生都在做练习");

}

}

class Graduate1 extends Student1{

int math = 93;

int computer = 99;

static int english = 85;

public Graduate1(){

study();

exercise();

}

public void study(){

System.out.println("Graduate.study:每位研究生都在认真学习");

}

public static void exercise(){

System.out.println("Graduate.exercise:所有研究生都在做练习");

}

public static void main() {

Student1 s = new Graduate1();

System.out.println();

Graduate1 g = new Graduate1();

System.out.print(s.math);

System.out.print("\t");

System.out.print(s.computer);

System.out.print("\t");

System.out.println(s.english);

System.out.print(g.math);

System.out.print("\t");

System.out.print(g.computer);

System.out.print("\t");

System.out.println(g.english);

}

}

1. 隐藏与覆盖类方法

在讲清这个问题之前,先明白什么是隐藏?什么是覆盖?

所谓隐藏,是指运行时系统调用当前对象引用的编译时类型中定义的方法;对于覆盖,则指运行时系统调用当前对象引用运行时类型中定义的方法。

所以在执行Student1 s = new Graduate1();和Graduate1 g = new Graduate1();时,(1)先进行Student1类的构造,这里包括两个方法study()和exercise(),由于study()方法被覆盖,所以先执行Graduate1里study(),再执行Student1里的exercise();(2)再进行Graduate1类的构造,同样包括两个方法study()和exercise(),所以执行顺序为先Graduate1里的study()方法,再Graduate1里的exercise()方法。

2. 隐藏与覆盖成员变量

如果子类中的变量和父类中的变量具有相同的名字,那么子类中的变量就会隐藏父类中的变量,不管他们的类型是什么,也不管他们是类变量还是实例变量。

所以在执行诸如System.out.print(s.math);之类的s实例的程序时,显示为Student1类的成员变量,而执行诸如System.out.print(g.math);之类的g实例的程序时,显示为Graduate1类的成员变量。

答案:

Graduate.study:每位研究生都在认真学习

Student.exercise:所有学生都在做练习

Graduate.study:每位研究生都在认真学习

Graduate.exercise:所有研究生都在做练习

Graduate.study:每位研究生都在认真学习

Student.exercise:所有学生都在做练习

Graduate.study:每位研究生都在认真学习

Graduate.exercise:所有研究生都在做练习

70 80 65

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