JAVA面向对象三大特性之一:多态
概述 多态是继封装、继承之后,面向对象的第三大特性
生活中,比如交通工具的种类可以分为飞机、汽车、轮船
再比如交通工具的运行方式飞机运行方式是飞在天上、汽车是在马路上开、轮船是在海上行驶
可见,同一行为,通过不同的事物,可以体现出来的不同的形态
多态,描述的就是这样的状态。
使用多态的前提:
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(); //输出:猫正在睡觉 } }
上一篇:
IDEA上Java项目控制台中文乱码