领略多态的魅力-对象向下转型 | 带你学《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面向对象编程文章查看此处

相关文章
|
1月前
|
安全 Java 编译器
Java对象一定分配在堆上吗?
本文探讨了Java对象的内存分配问题,重点介绍了JVM的逃逸分析技术及其优化策略。逃逸分析能判断对象是否会在作用域外被访问,从而决定对象是否需要分配到堆上。文章详细讲解了栈上分配、标量替换和同步消除三种优化策略,并通过示例代码说明了这些技术的应用场景。
Java对象一定分配在堆上吗?
|
29天前
|
Java 开发者
Java 面向对象编程
总之,Java 的面向对象编程为开发者提供了一种有效的编程范式,帮助他们构建出高质量、可维护的软件系统。理解和掌握面向对象的概念和原则是成为优秀 Java 开发者的重要基础。
46 3
|
2月前
|
Java API
Java 对象释放与 finalize 方法
关于 Java 对象释放的疑惑解答,以及 finalize 方法的相关知识。
50 17
|
1月前
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第22天】在Java的世界里,对象序列化和反序列化是数据持久化和网络传输的关键技术。本文将带你了解如何在Java中实现对象的序列化与反序列化,并探讨其背后的原理。通过实际代码示例,我们将一步步展示如何将复杂数据结构转换为字节流,以及如何将这些字节流还原为Java对象。文章还将讨论在使用序列化时应注意的安全性问题,以确保你的应用程序既高效又安全。
|
2月前
|
存储 Java 测试技术
Java零基础-多态详解
【10月更文挑战第10天】Java零基础教学篇,手把手实践教学!
35 4
|
2月前
|
存储 Java 数据管理
Java零基础-Java对象详解
【10月更文挑战第7天】Java零基础教学篇,手把手实践教学!
33 6
|
2月前
|
Java 编译器 程序员
Java多态背后的秘密:动态绑定如何工作?
本文介绍了Java中多态的实现原理,通过动态绑定和虚拟方法表,使得父类引用可以调用子类的方法,增强了代码的灵活性和可维护性。文中通过具体示例详细解析了多态的工作机制。
68 4
|
2月前
|
Oracle Java 关系型数据库
重新定义 Java 对象相等性
本文探讨了Java中的对象相等性问题,包括自反性、对称性、传递性和一致性等原则,并通过LaptopCharger类的例子展示了引用相等与内容相等的区别。文章还介绍了如何通过重写`equals`方法和使用`Comparator`接口来实现更复杂的相等度量,以满足特定的业务需求。
29 3
|
2月前
|
存储 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第9天】在Java的世界里,对象序列化是连接数据持久化与网络通信的桥梁。本文将深入探讨Java对象序列化的机制、实践方法及反序列化过程,通过代码示例揭示其背后的原理。从基础概念到高级应用,我们将一步步揭开序列化技术的神秘面纱,让读者能够掌握这一强大工具,以应对数据存储和传输的挑战。
|
1月前
|
存储 缓存 NoSQL
一篇搞懂!Java对象序列化与反序列化的底层逻辑
本文介绍了Java中的序列化与反序列化,包括基本概念、应用场景、实现方式及注意事项。序列化是将对象转换为字节流,便于存储和传输;反序列化则是将字节流还原为对象。文中详细讲解了实现序列化的步骤,以及常见的反序列化失败原因和最佳实践。通过实例和代码示例,帮助读者更好地理解和应用这一重要技术。
44 0
下一篇
DataWorks