- 代码
public class Father {
int i=1;
public void f()
{
System.out.println("father");
}
public Father() {
// TODO Auto-generated constructor stub
}
}
public class Child extends Father{
int i=14;
public void f()
{
System.out.println("child");
}
public Child() {
// TODO Auto-generated constructor stub
}
}
2.父类对象指向父类单元
Father a=new Father();
System.out.println(a.i);
a.f();
结果是 1
father
3.子类对象指向子类单元
Child a=new Child();
System.out.println(a.i);
a.f();
结果是:14
child
4.父类对象指向子类单元 ------ 上溯造型
Father a=new Child();
System.out.println(a.i);
a.f();
结果是:1
child
产生这个结果的原因:
子类定义与父类的同名变量,则对父类变量进行隐藏。(只要同名就隐藏,不管类型是否相同、是否都是类变量)
子类定义一个方法,与父类的成员方法原型相同,则对父类方法进行覆盖。
(要求: 返回类型、方法名、参数都完全一致;
子类方法的访问权限不能低于父类的权限;
子类方法不能比父类抛出更多异常;
满足这些才能实现方法覆盖)
所以:
对于父类来说,不知道子类是否有定义i 变量,所以只能输出自己的 i ;
但是由于方法是被覆盖的,所以调用的还是子类的方法。