多态概述
1,多态是Java继封装,继承之后的第三大特性
2,从字面意思来看可以理解为事物的多种形态,比如某某同学既可以是人,又可以是学生,出现两种形态
3,多态体现为父类对象引用子类实例
1 // 定义格式:父类类型 变量名=new 子类类型(); 2 Person p = new Student();
4,前提条件:必须有子父类关系
多态使用时的特点
1,多态成员属性:调用,执行向左看
1 Person p=new Student(); 2 System.out.println(p.age);//p是Person中的值,只能取到父类的值
2,多态成员方法:调用向左看,执行向右看
1 Person p=new Student(); 2 System.out.println(p.eat());//p的门面类型是Person ,但实际类型是Student,所以调用的是重写后的方法。
如何理解呢?p实际类型是Student类 但Person限制了p使用Student类独立Person类之外的属性和方法(这就是向左看,p只能调用Person及其父类的属性和方法)
如果子类中重写了父类的方法,执行的时候会调用重写后的方法(这就是向右看)
多态的类型转换
多态的转型分为向上转型和向下转型两种
向上转型:多态本身就是向上转型过的过程
使用格式:父类类型 变量名=new 子类类型();
适用场景:当不需要面对子类类型时,通过提高扩展性,或者使用父类的功能就能完成相应的操作。
向下转型:一个已经向上转型的子类对象可以使用强制类型转换的格式,将父类引用类型转为子类引用各类型(有限制)
使用格式:子类类型 变量名=(子类类型) 父类类型的变量;
适用场景:当要使用子类特有功能时。
1 //假设Person是父类,Student继承Person,BigStudent继承Student 2 Person p=new Student(); 3 4 //这是正确的,p能否下转为Student取决于p的实际类型 5 Student s=(Student)p; 6 7 //这是错误的,Student已经是p能下转的下限,但这个编译时不会报错,运行时才会 8 BigStudent bs=BigStudent (p);
小贴士:编译错误:编写代码时出现的红线和红×
运行错误:运行时控制台抛出的错误显示
instanceof关键字
用来判断某个对象是否属于某种数据类型。
注意: 返回类型为布尔类型
if(p instanceof Student){ ((Student) p).study(); }else if(p instanceof Teacher){ ((Teacher) p).goClass(); }