目录
1. 在多态的形式下,右边对象可以实现解耦合,以便扩展和维护。
2. 定义方法使用父类作为参数,可以接受所有子类,体现多态的扩展性和便利性。
a. 转换的时候不能瞎转,如果转为其他类的类型,运行时idea会报错(输入时不会报错)
b. 为了保证转化正确可以先判断(instanceof关键字) 对象a 是否是 Dog 类 的实例,如果是,则向下转型
多态的优势:
1. 在多态的形式下,右边对象可以实现解耦合,以便扩展和维护。
如:
Person p=new Student();
p.work();
谈若工作计划发生变化,工作交由教师进行:
标蓝的代码可以换成new Teacher()
即可
也就是优点是业务逻辑发生改变时,后续代码无需修改,只需改变右边对象即可。
2. 定义方法使用父类作为参数,可以接受所有子类,体现多态的扩展性和便利性。
在之前的学习的内容中我们也可以看到多态的优势;
如:
StringBuilder sb=new StringBuiler();
sb.append()
可添加所有类型的数据(即Object)
再如:ArrayList<> 倘若没有ArrayList<> 倘若没有定义存储变量的类型,其add方法中可以直接add "object",而object是顶级父类,也就是可以添加所有类型的数据。定义存储变量的类型,其add方法中可以直接add "object",而object是顶级父类,也就是可以添加所有类型的数据。
多态的弊端:
不能使用子类的特有功能
为什么?
如:
Person p=new Student();
根据多态中调用成员的特点(编译看左边,如果没有直接报错) 所有此时p只能调用父类Person中存在的变量或方法,不可调用子类中的新增的方法或变量。
如果我们要使用子类中的特有功能怎么办?
解决办法
将父类类型转回子类类型(向下转型)就可以了
如:
Animal a=new Dog();
Dog d=(Dog)a
此时就可以调用Dog类中的特有方法了
d.lookHome()
转化注意点:
a. 转换的时候不能瞎转,如果转为其他类的类型,运行时idea会报错(输入时不会报错)
如:
Animal a=new Dog();
Cat c=(Cat)a
此时会报错---Dog类 cannot be cast to Cat类
b. 为了保证转化正确可以先判断(instanceof关键字) 对象a 是否是 Dog 类 的实例,如果是,则向下转型
引用数据类型的类型转换,有几种方式?
自动类型转换(向上转型)
强制类型转换(向下转型)
强制转换能解决什么问题?
- 可以转为真正的子类类型,从而调用子类的特有功能