多态
基本介绍
多态的概念:同一个实体同时具有多种形式同一个类型的对象,执行同一个行为,在不同的状态下会表现出不同的行为特征。
多态的格式:
- 父类类型范围 > 子类类型范围
父类类型 对象名称 = new 子类构造器; 接口 对象名称 = new 实现类构造器;
多态的执行:
- 对于方法的调用:编译看左边,运行看右边(分派机制)
- 对于变量的调用:编译看左边,运行看左边
加端端老师免费领取更多Java资料
多态的使用规则:
- 必须存在继承或者实现关系
- 必须存在父类类型的变量引用子类类型的对象
- 存在方法重写
多态的优势:
- 在多态形式下,右边对象可以实现组件化切换,业务功能也随之改变,便于扩展和维护。可以实现类与类之间的解耦
- 父类类型作为方法形式参数,传递子类对象给方法,可以传入一切子类对象进行方法的调用,更能体现出多态的扩展性与便利性
多态的劣势:
- 多态形式下,不能直接调用子类特有的功能,因为编译看左边,父类中没有子类独有的功能,所以代码在编译阶段就直接报错了!
public class PolymorphicDemo { public static void main(String[] args) { Animal c = new Cat(); c.run(); //c.eat();//报错 编译看左边 需要强转 go(c); go(new Dog); } //用 Dog或者Cat 都没办法让所有动物参与进来,只能用Anima public static void go(Animal d){} } class Dog extends Animal{} class Cat extends Animal{ public void eat(); @Override public void run(){} } class Animal{ public void run(){} }
上下转型
基本数据类型的转换: 1.小范围类型的变量或者值可以直接赋值给大范围类型的变量。 2.大范围类型的变量或者值必须强制类型转换给小范围类型的变量。
引用数据类型的自动类型转换语法:子类类型的对象或者变量可以自动类型转换赋值给父类类型的变量。
父类引用指向子类对象
- 向上转型(upcasting):通过子类对象(小范围)实例化父类对象(大范围),这种属于自动转换
- 向下转型(downcasting):通过父类对象(大范围)实例化子类对象(小范围),这种属于强制转换
public class PolymorphicDemo { public static void main(String[] args){ Animal a = new Cat();//向上转型 Cat c = (Cat)a;//向下转型 } } class Animal{} class Cat extends Animal{}
instanceof
instanceof:判断左边的对象是否是右边的类的实例,或者是其直接或间接子类,或者是其接口的实现类
- 引用类型强制类型转换:父类类型的变量或者对象强制类型转换成子类类型的变量,否则报错
- 强制类型转换的格式:类型 变量名称 = (类型)(对象或者变量)
- 有继承/实现关系的两个类型就可以进行强制类型转换,编译阶段一定不报错,但是运行阶段可能出现类型转换异常 ClassCastException
public class Demo{ public static void main(String[] args){ Aniaml a = new Dog(); //Dog d = (Dog)a; //Cat c = (Cat)a; 编译不报错,运行报ClassCastException错误 if(a instanceof Cat){ Cat c = (Cat)a; } else if(a instanceof Dog) { Dog d = (Dog)a; } } } class Dog extends Animal{} class Cat extends Animal{} class Animal{}