上一篇:领略多态的魅力-对象向上转型 | 带你学《Java面向对象编程》之四十八
【本节目标】
通过阅读本节内容,你将完整了解面向对象多态性的各种实现模式,学会借助向上、向下转型实现高效编程。
对象向下转型
向下转型的主要特点在于需要使用一些子类自己特殊的定义处理。
图一 理解向下转型
范例:实现向下转型
class Person {
public void print() {
System.out.println(“一个正常的人类行为,吃饭、睡觉、繁衍。”) ;
}
}
class SuperMan extends Person {
public String fly () {
return “我可以飞。。。”;
}
public String fire () {
return “我可以喷火。。。” ;
}
}
public class JavaDemo{
public static void main(String args[]) {
System.out.println(“--------------正常状态下的超人应该是一个普通人的状态---------------”) ;
Person per = new SuperMan() ; //向上转型
per.print();
System.out.println(“--------------外星怪兽狗骚扰地球,准备消灭人类 ---------------”) ;
SuperMan man = (SuperMan) per ; //向下转型
System.out.println(man.fly()) ;
System.out.println(man.fire()) ;
}
}
向上描述的是一些公共的特征,而向下描述的是子类自己特殊的定义环境。但是需要明确的是,向下转型并不是一件安全的事情。因为在进行向下转型之前一定要首先发生向上转型。
范例:观察错误的程序
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类
}
}
执行结果:
Exception in thread “main” java.lang.ClassCastException:Person cannot be cast to SuperMan at JavaDemo.main
以后只要是发生对象的向下转型之前一定要首先向上转型,两个没有任何关系的实例如果要发生强制转换,就会出现“ClassCastException”异常,所以向下转型并不是一件安全的事情。
instanceof关键字
通过分析可以发现,向下转型本身是一件存在有安全隐患的操作,所以为了保证向下转型的正确性,往往需要在进行转型之前进行判断,判断某个实例是否是某个类的对象。这个就需要通过instanceof语法来实现。语法如下:
对象 instanceof 类
该判断将返回一个boolean类型,如果是true表示实例是指定类对象。
范例:观察instanceof的使用
public class JavaDemo{
public static void main(String args[]) {
Person per = new Person () ; //不转型
System.out.println(per instanceof Person) ; //true
System.out.println(per instanceof SuperMan) ; //false
}
}
范例:观察instanceof关键字
public class JavaDemo{
public static void main(String args[]) {
Person per = new SuperMan () ; //向上转型
System.out.println(per instanceof Person) ; //true
System.out.println(per instanceof SuperMan) ; //true
}
}
所以在日后进行项目的开发过程之中,如果要执行对象的向下转型,最好先判断一次。
class Person {
public void print() {
System.out.println(“一个正常的人类行为,吃饭、睡觉、繁衍。”) ;
}
}
class SuperMan extends Person {
public String fly () {
return “我可以飞。。。”;
}
public String fire () {
return “我可以喷火。。。” ;
}
}
public class JavaDemo{
public static void main(String args[]) {
Person per = new SuperMan () ; //向上转型
if (per instanceof SuperMan) {
SuperMan man = (SuperMan) per ;
System.out.println(man.fly()) ;
System.out.println(man.fire()) ;
}
}
}
在以后进行一些完善性的程序开发的过程之中,对于转型之前一定要使用instanceof判断。
想学习更多的Java的课程吗?从小白到大神,从入门到精通,更多精彩不容错过!免费为您提供更多的学习资源。
本内容视频来源于阿里云大学