- 都是由于子类声明了与父类同名的变量或 方法引起的
- 隐藏的话父类的属性和行为并未失去,通过相应子类的引用仍可访问
- 覆盖(重写),父类的属性和行为已被子类重定义的属性和行为覆盖,通过相应子类的引用不能访问(父类的对象才行)
- 父类的静态成员函数只能隐藏,不能覆盖
- 只有实例方法才能体现多态
如:
假设有一个父类Father和一个子类Son。父类有一个成员变量a=0;有一个静态成员变量b=0;有一个成员方法f,输出0;有一个静态成员方法g,输出0。子类分别重写这些变量和方法,只是修改变量的值和方法的输出,全部改为1. 我们再声明一个静态类型是父类,动态类型是子类的引用:
Father father=new Son();
结果:father.a=0
father.b=0
father.f():1
father.g():0
package test;
//声明父类
class Father{
static int a=0;
int b=0;
void f() {
System.out.println(0);
}
static void g() {
System.out.println(0);
}
}
//声明子类
class Son extends Father{
static int a=1;
int b=1;
void f() {
System.out.println(1);
}
static void g() {
System.out.println(1);
}
}
/* 隐藏和覆盖的区别 */
public class HideAndCover {
public static void main(String[] args) {
Father father=new Son();
System.out.println(father.a);
System.out.println(father.b);
father.f();
father.g();
}
}
0
0
1
0