如何理解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
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
相关文章推荐
- 如何理解Java中的隐藏与覆盖
- Java重载、覆盖、多态、隐藏的区别与联系
- java中,如何理解MVC思想
- 如何理解 Java 中的 <T extends Comparable<? super T>>
- 关于多态,隐藏,覆盖的理解
- java中重载,覆盖和隐藏的区别
- 【转】如何在Java中避免equals方法的隐藏陷阱
- 如何理解Java中的方法
- java面向对象思想如何理解
- java面试--多线程 基本理解 (线程5个状态如何变化?还有等待、阻塞、让步等如何形成的?)
- 如何理解Java的泛型
- 如何理解JAVA的跨平台特性
- 用JAVA在读取EXCEL文件时如何判断列隐藏
- java面向对象思想如何理解
- Java的隐藏和覆盖的区别
- java的重载、覆盖和隐藏的区别
- 蜂窝教育:教你如何理解Java面向对象
- 如何理解java的引用传递
- java 关于Spring中Aop的简单理解以及SpringBoot如何添加Aop实现步骤
- 如何理解java自定义注解