概述
多态是继封装、继承之后,面向对象的第三大特性
生活中,比如交通工具的种类可以分为飞机、汽车、轮船
再比如交通工具的运行方式飞机运行方式是飞在天上、汽车是在马路上开、轮船是在海上行驶
可见,同一行为,通过不同的事物,可以体现出来的不同的形态
多态,描述的就是这样的状态。
使用多态的前提:
1. 存在继承或者实现关系
2. 子类或实现类必须重写父类方法
3. 父类引用指向子类对象
例:
创建一个Animal父类
public class Animal{
private String name;
private int age;
public void eat (){
System.out.println("动物吃饭");
}
}
创建一个Dog类继承Animal类,且重写父类方法
public class Dog extends Animal{
private String name;
private int age;
@Override
public void eat(){
System.out.pringln("狗正在吃饭");
}
public void sleep(){
System.out.println("狗正在睡觉");
}
}
主方法内:
Animal a = new Dog();
a.eat(); //输出:狗正在吃饭
a.sleep(); //编译出错,无法执行
使用父类引用指向子类对象(多态),也就是将Dog类向上转型成Animal类(小的数据类型变成大的数据类型)
重写了父类成员方法后,父类引用指向子类对象调用成员方法,则会运行输出子类的方法体
不能调用子类特有成员方法!!!!
若想调用子类特有成员方法,则需要使用到一个instanceof 判断对象类型
格式:
对象名 instanceof 类名
Animal a = new Dog();
if(a instanceof Dog){
System.out.println("此对象属于Dog类");
}else{
System.out.println("不属于");
}
判断属于Dog类后,可以使用向下转型(大的数据类型强转成小的数据类型)
子类类型 变量名 = (子类类型) 父类变量名;
向下转型后的变量数据类型转换回子类,可以调用子类特有方法
Animal a = new Dog();
if(a instanceof Dog){
Dog dog = (Dog) a;
}
dog.sleep(); //输出:狗正在睡觉
现实开发使用中,直接使用父类指向子类对象,然后调用重写方法使用性很低
一般使用多态的场景
使用父类作为方法参数 ,便可以将所有子类传至方法中
创建多一个Cat类
public class Cat extends{
private String name;
private int age;
@Override
public void eat(){
System.out.println("猫正在吃饭");
}
public void jump(){
System.out.println("猫正在跳");
}
}
创建一个方法参数为父类Animal:
创建Cat、Dog两个对象,然后传入方法中
实际上这就是多态:
Cat c = new Cat();
Animal a = c; //c也就是 new Cat();
Animale a = new Cat();
并且在此类方法体中,还可以通过instanceof判断数据类型
然后向下转型,调用子类特有方法
public static void (String [] args){
Cat c = new Cat();
Dog d = new Dog();
whoEat(c); //输出:猫正在吃饭
whoEat(d); //输出:狗正在吃饭
}
public static void whoEat(Animal a){
a.eat();
if(a instanceof Cat){
Cat c1 = (Cat)a;
c1.jump(); //输出:猫正在跳
}else if (a instanceof Dog){
Dog d1 = (Dog)a;
d1.sleep(); //输出:猫正在睡觉
}
}