1、向上转型的有什么用处?直接创建子类对象不是更方便?
向上转型的语法:父类类型 父类引用 = new 子类类型(参数);
即:使用父类引用指向子类实例化对象,也称为自动转型或隐式转型。
此时,该引用只能访问子类继承或重写父类的方法,而不能直接访问子类特有的方法。向上转型多适用于,有多个同父子类共同应用的场景,此时,可以借由父类引用,根据实际需要,转型为特定的子类对象实现多态。
譬如:父类Person,有3个子类Chinese、French、Russian,类中分别重写了eat方法
此时,在测试类中,如果需设置方法实现对各子类eat方法的调用。
方案1:创建eatTest方法,设置参数为父类类型,利用向上转型,在main方法中调用时,分别直接传入子类即可。
运行结果:
方案2:分别设置3个eatTest的重载方法,分别设置参数为:Chinese、French、Russian,main方法不变,运行结果也与方案1相同。
由此可清晰看出,采用向上转型设置的方案更加简单灵活。如后续再新增加新的子类,也无需新增eatTest方法,非常方便。
2、为什么需要向下转型,直接实例化子类不是更简单?
向下转型一般是为了重新获得因为向上转型而丢失的子类特性而存在,因此,通常在向下转型前需要先进行向上转型,向下转型通常也会结合instanceof一起应用。
譬如:修改上一问题中的3个子类Chinese、French、Russian,类中分别新增各自独有的方法。
此时如需在测试类eatTest方法中,修改eatTest ,实现针对传入不同的参数分别调用各自独立方法,则可以参考如下代码
由此可见,借由向下转型,可以在灵活应用多态的基础上,同时兼顾子类的独有性,相较于直接创建子类实例,提高了代码加灵活性。