子类的对象可以向上造型为父类的类型。即父类引用子类对象,这种方式被称为向上造型。
子类的对象可以复制给父类的变量,注意在Java中不存在对象对最响的赋值,而父类的对象不能赋值给子类的变量。
Student s;
Cla = new Cla();
s=c;//正确
c=s//会出现编译错误
要想使c=s;可以使用造型
c=(Class) s;//只有当s这个变量的实际管理者时Class才可以
造型用括号圈起来的类型放在值的前面,对象本身并没有发生任何变化,所以不是类型转换,运行时会有机制来检查这样的机制是否合理。
但是父类不能引用子类中的属性或方法。只能由子类重写父类中的方法或属性。
public static void main(String[] args) {
Person p = new Student();
System.out.println("name="+p.name);
p.action();
//编译不通过,父类不能直接调用子类属性和方法
}
向上造型重写父类方法,方法的访问权限一定要大于等于父类,并且返回值要和父类相同。
public void action() {
name="ww";
System.out.println(name);
}
//编译通过,访问权限大于父类
private void action() {
name="ww";
System.out.println(name);
}
//编译不通过,权限小于父类
protected void action() {
name="ww";
System.out.println(name);
}
//编译通过,访问权限和父类一致
protected int action() {
return 1;
}
//编译不通过,数据类型不一致
多态
函数的调用绑定:当通过对象变量调用函数的时候,调用哪一个函数这件事叫做绑定。
静态绑定:根据变量的声明类型来决定;动态绑定:根据变量的动态类型来决定。
在成员函数中调用其他成员函数也是通过this这个对象变量来调用的。
覆盖override:子类和父类中存在名称和参数完全相同的函数,这一对函数构成覆盖关系。通过父类的变量调用存在覆盖关系的函数时,会调用变量当时所管理的对象所属的函数。
多态的特点:
多态的前提:继承、方法的重写;
父类引用指向子类对象;
多态中,编译看左边,运行看右边。