课时76:对象向下转型
摘要:向下转型的主要特点在于需要使用到一些子类自己特殊的定义处理。
1. 向下转型的介绍
2. 实现向下转型
3. 向上转型和向下转型的联系
01. 向下转型的介绍
例如我此时想定义一个动物,动物是一个很大的范围,动物下包含了很多,例如狗、人等。那么在人这么一个类里面,它规定的应该是一些人的具体描述。人这一类中有包含很多,例如超人等。 那图中的小强是超人吗?
超人除了会飞等特征之外,和人是一样的。若现在有一个很可怕的情况,那应该派小强去还是小高去?那次是我们应该派一个较能打的,此时包含了能打的特指,那我们就应该排超人小高出面。
根据以上例子,可以总结出我们什么情况下需要向下转型,我们发现父类中没有的功能时,就需要向下转型。
02. 实现向下转型
假如正常情况下我们来写一个操作代码,一个人可能会有一些基础信息,随便写一个叫 Print(),加上一个正常的人类行为,吃饭、睡觉、繁衍。
再找一个超人,具备人类的全部的功能,还有额外的可以飞、可以喷火的功能。正常情况下,超人混入在普通人中,我们看得出来吗?我们看不出来,所以正常情况下,超人就是一个人,这个时候,我们就称之为向上转型。正常状态下的超人应该是一个普通人的状态。
代码如下:
class Person { public void print() { System.out.println("一个正常的人类行为,吃饭、睡觉、繁衍。"); } } class SuperMan extends Person { public String fly() { return "我可以飞。。。"; } public String fire() { return "我可以喷火。。。"; } }
编译结果为:
如果我们现在假设外星怪兽狗骚扰地球,准备消灭人类,此时,超人还能当普通人吗?并不能。此时应该发挥超人的功能:
代码如下:
System.out.println("----------- 外星怪兽狗骚扰地球,准备消灭人类 -----------"); SuperMan man = (SuperMan) per; // 向下转型 System.out.println(man.fly()); System.out.println(man.fire());
编译结果为:
正常情况下,超人是个普通人。如果殊情况出现,则超人的功能会发挥出来。
03. 向上转型与向下转型的联系
由以上示例可知,向上转型描述的是一些公共的特征,而向下转型描述的是子类自己特殊的定义环境。这也是向下转型存在的意义。
但是我们需要明确的是,向下转型并不是一件安全的事情。因为在进行向下转型之前,一定要首先发生向上转型。
例如接以上示例,当世界遇上危机,一个普通人站出来说自己是超人:
此时,普通人小强并不能承受住怪兽带来的攻击。
范例:(并未进行向上转型)观察错误的程序
代码如下:
public String fire() { return "我可以喷火。。。"; } public class JavaDemo { public static void main(String args[]) { System.out.println("--------------------------- 正常状态下的超人应该是一个普通人的状态 ---------------------------"); Person per = new Person(); // 不转型 per.print(); System.out.println("----------- 外星怪兽狗骚扰地球,准备消灭人类 -----------"); } }
编译结果为:
正常的状态的超人应该是一个普通人的状态,可一旦有怪兽,就像小强,只是个普通人,在此情况下直接上战场,此时的 SuperMan类与 Person类有联系吗?答案是并没有。
代码如下:
public class JavaDemo { public static void main(String args[]) { System.out.println("--------------------------- 正常状态下的人应该是一个普通人的状态 ---------------------------"); Person per = new Person(); // 不转型 per.print(); System.out.println("--------------------------- 外星怪兽狗骚扰地球,准备消灭人类 ---------------------------"); SuperMan man = (SuperMan) per; // SuperMan类与Person类向下转型 } }
此时的运行结果为:
可见,此时的代码出现了一个严重的错误,Person并不能变成 SuperMan。因为小强的本质只是一个普通人。
所以,以后只要是发生对象的向下转型之前一定要首先发生向上转型,两个没有任何关系的实例如果要发生强制转换,那么就会出现 “ClassCastException”异常,所以向下转型并不是一件安全的事情。
且向下转型并不是一个常用的概念,但是要明确向下转型的主要目的是为了调用子类的功能,所以在此之前一定要向上转型。