多态概述
- 父类创建的对象指向了子类对象
- 一个对象对应着不同的类型
- 父类或者接口的引用指向其子类对象
多态优缺点
- 优点
- 多态的出现提高了代码的重用性和扩展性
- 前期定义的代码可以使用后期实现的内容
- 缺点
- 前期定义的内容,不能使用后期子类出现的特有内容
多态转型
abstract class Person{
public abstract void show();
}
class Student extends Person{
public void show(){
System.out.println("Student show");
}
public void show2(){
System.out.println("Student show2");
}
}
- 自动类型提升 Person p=new Student();Person和Student之间存在实现或者继承关系
- 类型向上转型之后就可能限制了功能的访问
- 如果还需要使用子类的特有功能,则需要将该对象向下强制转型 Student student=(Student)p;
类型判断
- instanceof 用户判断变量的具体类型,只能用于引用数据类型判断。
- 在强制转型之前,为了代码的健壮性,最好加入类型判断。
多态特点
- 成员函数
- 编译时:参照引用类型中是否有函数的声明
- 运行时:使用什么类进行实例化调用哪个类的函数
- 成员函数动态绑定到指定的对象上
- 成员变量(比较特殊)
- 覆盖只存在于函数中
- 编译时:参考引用类型的类中是否存在该成员,否则报错
- 运行时:参考引用类型的类中是否存在成员变量, 并运行该类型所属类
class Parent{
int num=3;
}
class Child extends Parent{
int num=4;
}
class Demo3Run{
public static void main(String[] args){
Child c1=new Child();
System.out.println("c1.num:"+c1.num);
Parent p2=new Child();
System.out.println("p2.num:"+p2.num);
Parent c3=c1;
System.out.println("c3.num:"+c3.num);
Child c4=(Child)p2;
System.out.println("c4.num:"+c4.num);
}
}
打印结果:
c1.num:4
p2.num:3
c3.num:3
c4.num:4
- 静态函数
- 哪个类调用的即调用那个类的,如果子类不存在该函数,则调用父类的,如果子类已经定义过,则使用子类的,跟静态函数差不多,跟引用类型的类相关。但是也存在子类覆盖父类的现象。