一、多态
概述
面向对象语言三大特征:封装(private)、继承(extends)、多态。 多态:表示的是一个事物的多种表现形态。同一个事物,以不同的形态表现出来.**
使用多态的前提
- 继承(extends)或者实现(implements)【二选一】
- 方法的重写【意义体现:不重写,无意义】
- 父类引用指向子类对象【格式体现】
:::
多态的体现
小结:多态的好处是提高程序的灵活性,扩展性父类类型 变量名 = new 子类对象; 变量名.方法名();|
引用类型转换
多态的转型分为向上转型与向下转型两种:
- 向上转型:多态本身是子类类型向父类类型向上转换的过程,这个过程是默认的。
当父类引用指向一个子类对象时,便是向上转型。
父类类型 变量名 = new 子类类型();如:Animal a = new Cat();
- 向下转型:父类类型向子类类型向下转换的过程,这个过程是强制的。
一个已经向上转型的子类对象,将父类引用转为子类引用,可以使用强制类型转换的格式,便是向下转型。
子类类型 变量名 = (子类类型) 父类变量名;如:Cat c =(Cat) a;
abstract class Animal {abstract void eat();}class Cat extends Animal {public void eat() {System.out.println("吃鱼");}public void catchMouse() {System.out.println("抓老鼠");}}class Dog extends Animal {public void eat() {System.out.println("吃骨头");}public void watchHouse() {System.out.println("看家");}}测试类public class Test {public static void main(String[] args) {// 向上转型Animal a = new Cat();a.eat(); // 调用的是 Cat 的 eat// 向下转型Cat c = (Cat)a;c.catchMouse(); // 调用的是 Cat 的 catchMouse}}
转型的异常:ClassCastException类型转换异常
避免ClassCastException的发生,Java提供了 instanceof 关键字,给引用变量做类型的校验变量名 instanceof 数据类型
如果变量属于该数据类型,返回true。
如果变量不属于该数据类型,返回false。
public class Test {public static void main(String[] args) {// 向上转型Animal a = new Cat();a.eat(); // 调用的是 Cat 的 eat// 向下转型if (a instanceof Cat){Cat c = (Cat)a;c.catchMouse(); // 调用的是 Cat 的 catchMouse} else if (a instanceof Dog){Dog d = (Dog)a;d.watchHouse(); // 调用的是 Dog 的 watchHouse}}}
