一、多态的概述
1.面向对象程序设计的三大支柱是封装、继承和多态。
2.多态的前提条件就是必须有继承关系。继承关系就是使一个子类能继承父类的特征,并且附加一些新特征。子类是它的父类的特殊化,每个子类的实例都是其父类的实例,但是反过来不成立。
3.多态意味着父类型的变量可以引用子类型的对象。
4.多态在子类中要重写在父类中已存在的方法。
二、多态的向上转型和向下转型
1.向上转型:
格式: 父类名称 对象名 = new 子类名称();
含义:右侧创建了一个子类对象,把它当作父类来看待使用。
小范围的对象向上转换为更大范围的对象,如:
Animal animal=new Cat();//猫->动物
2.向下转型:
格式: 子类名称 对象名 =(子类名称) 父类对象;
含义:将子类还原,还原成为本来的子类对象
Cat cat =(Cat) animal;//本来是猫,向上转型成为动物,还原回来成为本来的猫
三、instanceof关键字
作用:用来判断某个对象是否属于某种数据类型。
注意: 1)先有继承关系,再有instanceof的使用。
2)返回类型为boolean类型,如果左右两边比对成功,返回 true ;否则返回 flase
3)当该测试对象创建时右边的声明类型和左边的类其中的任意一个跟测试类必须得是继承树的同一分支或存在继承关系,否则编译器会报错。
应用场景:需要用到对象的强制类型转换时,需要使用instanceof进行判断。
Person p1 = new Person();
Person p2 = new Man();
Man m1 = new Man();
System.out.println(p1 instanceof Man);//false
System.out.println(p2 instanceof Man);//true
System.out.println(m1 instanceof Man);//true
四、多态实例
public class demo {
public static void main(String[] args) {
People p=new Stu();
p.eat();
//调用特有的方法
Stu s=(Stu)p;
s.study();
//((Stu) p).study();
}
}
class People{
public void eat(){
System.out.println("吃饭");
}
}
class Stu extends People{
@Override
public void eat(){
System.out.println("吃水煮肉片");
}
public void study(){
System.out.println("好好学习");
}
}
class Teachers extends People{
@Override
public void eat(){
System.out.println("吃樱桃");
}
public void teach(){
System.out.println("认真授课");
}
}
五、多态的优点
1.可替换性(substitutability)。多态对已存在代码具有可替换性。例如,多态对圆Circle类工作,对其他任何圆形几何体,如圆环,也同样工作。
2.可扩充性(extensibility)。多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际上新加子类更容易获得多态功能。例如,在实现了圆锥、半圆锥以及半球体的多态基础上,很容易增添球体类的多态性。
3.接口性(interface-ability)。多态是超类通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的。
4.灵活性(flexibility)。它在应用中体现了灵活多样的操作,提高了使用效率。
5.简化性(simplicity)。多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。