1.多态的优势:
1.在多态形式下,右边对象可以实现解耦合,便于扩展和维护
Person p=new Student();
p.work();//业务逻辑发生改变时,后续代码无需修改,只改上边的new Student就可以了
2.定义方法的时候,使用父类型作为参数,可以接收所有子类对象,体现多态的扩展性与便利
2.多态的弊端:
不能使用子类的特有功能
3.引用数据类型的类型转换,有几种方式:
自动类型转换:Person p=new Student();
强制类型转换:Student s=(Student)p;
4.强制类型转换能解决什么问题:
可以转换成真正的子类类型,从而调用子类独有功能
转换类型与真实对象类型不一致会报错
转换时用instanceof关键字进行判断
示例:
细节:转换的时候不能瞎转,如果转成其他类的类型就会报错
//Cat1 c=(Cat1)a;//运行时会报错
//解决方法:能不能有一个在转换时判断一下呢
//能:instanceof
package a02polymorphismdemo2;
public class Test1 {
public static void main(String[] args) {
//多态方式创建对象
Animal1 a=new Dog1();
//编译看左边,运行看右边
a.eat();
//多态的弊端
//不能调用子类的特有功能
//当调用成员方法时:编译看左边,运行看右边
//那么在编译的时候会先检查左边的父类中有没有这个方法,如果没有直接报错
//a.lookHome();//报错
//解决方案
//把调用者a再变回子类类型就可以了
//Dog1 d=(Dog1)a;
//细节:转换的时候不能瞎转,如果转成其他类的类型就会报错
//Cat1 c=(Cat1)a;//运行时会报错
//解决方法:能不能有一个在转换时判断一下呢
//能:instanceof
// if(a instanceof Dog1){
// Dog1 d=(Dog1)a;
// d.lookHome();
// }else if(a instanceof Cat1){
// Cat1 c=(Cat1)a;
// c.catchMouse();
// }else{
// System.out.println("没有这个类型,无法转换");
// }
//JDK14之后出现了一个新特性:把判断和强转两个合在一起写
//先判断a是否为Dog1类型,如果是则强转成Dog类型,转换之后变量名为d
//如果不是,则不强转,结果直接是false
if(a instanceof Dog1 d){
d.lookHome();
}else if(a instanceof Cat1 c){
c.catchMouse();
}else{
System.out.println("没有这个类型,无法转换");
}
}
}
class Animal1{
public void eat(){
System.out.println("动物在吃东西");
}
}
class Dog1 extends Animal1{
@Override
public void eat() {
System.out.println("狗吃骨头");
}
public void lookHome(){
System.out.println("狗看家");
}
}
class Cat1 extends Animal1{
@Override
public void eat() {
System.out.println("猫吃小鱼干");
}
public void catchMouse(){
System.out.println("猫抓老鼠");
}
}
运行结果: