现实事物经常会体现出多种形态,如学生,学生是人的一种,则一个具体的同学张三既是学生也是人,即出现两种形态。
Java作为面向对象的语言,同样可以描述一个事物的多种形态。如Student类继承了Person类,一个Student的对象便既是Student,又是Person。
多态体现为父类引用可以指向子类对象
格式:
定义格式:父类类型 变量名=new 子类类型();
多态是同一个行为具有多个不同表现形式或形态的能力。
类的引用类型变量指向了子类的对象或者是接口类型的引用类型变量指向了接口实现类 的对象。
抽象类 变量名 = new 抽象类子类();
接口 变量名 = new 接口实现类();
Fu f=new Zi();
System.out.println(f.num);//f是Fu中的值,只能取到父中的值
多态成员方法 编译看左边,运行看右边
也就是编译时要检查Fu中是否有该方法,没有就会报错,如果有运行时会执行右边的,也就是子类覆盖的方法。
Fu f1=new Zi();
System.out.println(f1.show());//f1的门面类型是Fu,但实际类型是Zi,所以调用的是重写后的方法。
作用:用来判断某个对象是否属于某种数据类型。
测试对象是否是某种指定的类型
使用:
Fu f1=new Zi();
if(f1 instanceof Zi){
System.out.println("f1是Zi的类型");
}
多态的转型分为向上转型和向下转型两种
向上转型:多态本身就是向上转型过的过程
? 使用格式:父类类型 变量名=new 子类类型();
? 适用场景:当不需要面对子类类型时,通过提高扩展性,或者使用父类的功能就能完成相应的操作。
向下转型:一个已经向上转型的子类对象可以使用强制类型转换的格式,将父类引用类型转为子类引用各类型
? 使用格式:子类类型 变量名=(子类类型) 父类类型的变量;
? 适用场景:当要使用子类特有功能时。
其实多态的作用就是将多个类的特有功能集合到了一起,比如一个人有eat()
方法,那么学生,老师,医生等都有这个方法,此时如果我们需要统一的让这些人都执行eat()
方法,按照传统的方法,我们需要一个一个去调用,优化一点就可以相同类型的实现一个方法去调用,多态则是更抽象化了,因为这些职业都是人,所以我们只需要传入一个父类对象即可,具体运行的时候,就会运行具体的对应的方法了。
People student = new Student();
People teacher = new Teacher();
People doctor = new Doctor();
public void toEat(People people){
people.eat();
}
// 这样就能将方法统一了。
使用多态的优点是能够提高代码的扩展性和可维护性,使用父类类型作为方法的形式参数,实现了运行时的动态绑定。
Java的多态不仅增强了程序的扩展性,同时还可以使用接口或抽象类定义的方法名来约束子类,使得程序更加规范。可以说是面向对象编程不可或缺的一部分。
欢迎大家访问我的个人博客 无限进步的博客
如内容有任何问题,欢迎提出!