领略多态的魅力-对象向下转型 | 带你学《Java面向对象编程》之四十九

简介: 本节将为读者介绍对象多态性中的另一部分-向下转型,并为读者介绍了向下转型中用到的instanceof关键字的作用与用法。

上一篇:领略多态的魅力-对象向上转型 | 带你学《Java面向对象编程》之四十八
【本节目标】
通过阅读本节内容,你将完整了解面向对象多态性的各种实现模式,学会借助向上、向下转型实现高效编程。

对象向下转型

向下转型的主要特点在于需要使用一些子类自己特殊的定义处理。

image.png
图一 理解向下转型

范例:实现向下转型

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的课程吗?从小白到大神,从入门到精通,更多精彩不容错过!免费为您提供更多的学习资源。
本内容视频来源于阿里云大学

下一篇:万类之祖-Object简介 | 带你学《Java面向对象编程》之五十
更多Java面向对象编程文章查看此处

相关文章
|
4天前
|
安全 Java 编译器
java中类与对象回顾总结-2
java中类与对象回顾总结
14 3
|
4天前
|
Java 编译器
java中类与对象回顾总结-1
java中类与对象回顾总结
14 3
|
1天前
|
安全 Java 数据安全/隐私保护
Java一分钟之-Java反射机制:动态操作类与对象
【5月更文挑战第12天】本文介绍了Java反射机制的基本用法,包括获取Class对象、创建对象、访问字段和调用方法。同时,讨论了常见的问题和易错点,如忽略访问权限检查、未捕获异常以及性能损耗,并提供了相应的避免策略。理解反射的工作原理和合理使用有助于提升代码灵活性,但需注意其带来的安全风险和性能影响。
15 4
|
3天前
|
Java
04|零基础玩转面向对象编程:Java OOP
04|零基础玩转面向对象编程:Java OOP
5 0
|
3天前
|
Java
【JAVA基础篇教学】第五篇:Java面向对象编程:类、对象、继承、多态
【JAVA基础篇教学】第五篇:Java面向对象编程:类、对象、继承、多态
|
3天前
|
缓存 Java 程序员
关于创建、销毁对象⭐Java程序员需要掌握的8个编程好习惯
关于创建、销毁对象⭐Java程序员需要掌握的8个编程好习惯
关于创建、销毁对象⭐Java程序员需要掌握的8个编程好习惯
|
4天前
|
Java
从源码出发:JAVA中对象的比较
从源码出发:JAVA中对象的比较
12 3
|
4天前
|
Java
java面向对象——包+继承+多态(一)-2
java面向对象——包+继承+多态(一)
16 3
|
4天前
|
SQL Java 编译器
java面向对象——包+继承+多态(一)-1
java面向对象——包+继承+多态(一)
16 2
|
4天前
|
存储 Java 程序员
Java面向对象编程的基础概念解析
Java面向对象编程的基础概念解析
13 0