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

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

对象向下转型

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

领略多态的魅力-对象向下转型   | 带你学《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的课程吗?从小白到大神,从入门到精通,更多精彩不容错过!免费为您提供更多的学习资源。
本内容视频来源于阿里云大学

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

上一篇:Linux防火墙设置-DNS服务器篇


下一篇:机器学习 vs 深度学习到底有啥区别,为什么更多人选择机器学习