目标
5.2 给定一场景,编代码,演示多态性的使用。而且,要判断何时需要强制转换,还要区分于对象引用强制转换相关的编译器错误和运行时错误。
当我们希望使用animal引用变量来调用只有Dog类才拥有的方法时,会发生什么情况呢?你知道它引用一个Dog,你想做Dog特有的事情吗?下下面的代码中会得到以组Animal,并且只要在该Animal组中找到一个Dog,我们就像实现Dog特有的事情。现在,除了不能确定调用playDead()方法的代码行意外,我们认可所有代码行都是正确的。
当编译这段代码时,编译器会给出如下信息:
can not find symbol
编译器是在说:“Animal类没有playDead()方法。” 让我们修改if代码块:
上面新改进的代码包含一个强制转换。就这种情况而言 ,有时它称为向下转型,因为是将继承树向下强制转换到更具体的类。现在,编译器会很高兴很高兴地让它通过编译。在尝试调用playDead()之前,我们将animal变量强制转换成Dog类型。
在执行向下强制转换时,务必牢记,编译器将被迫信任我们——即使我们将事情弄糟也如此:
代码通过了编译!但在尝试运行它是,将得到如下异常:
java.lang.ClassCastException