Java入门-向下转型的安全判断

向下转型的安全判断
向下转型的安全判断使用原因
多态实现了引用类型的向上转型,我们也可以进行向下转型,
但是向下转型不一定是安全的,要先进行安全判断,
只有父引用原本指向的类型和与向下转型的类型一致,才能转,
因此我们需要进行向下转型的安全判断
向下转型的安全判断具体方法
1.instanceof关键字

格式:
父引用 instanceof 子类 

其返回的是一个Boolean类型的值

2.用字节码对象去判断
因为一个类只有一个字节码对象,所以只需要将父引用的字节码对象和欲向下转型的类型的字节码对象进行比较,看是否相等也就可以判断算法向下转型安全与否了

格式:
if(父引用.getClass() == 类名.class){
                //向下转型
}

具体代码实例:

package com.tan.typecast1;

public class Demo {
    public static void main(String[] args) {
//        向上转型
        Person person = new Chinese();
//        p.dialect  报错,向上转型的弊端:丢失子类的特有成员,无法进行调用

//        向下转型
        Chinese chinese = (Chinese)person;
        System.out.println("chinese.dialect = " + chinese.dialect);
        chinese.eat();
        chinese.talk();
        System.out.println("===============");


//        向下转型不一定是安全的,要先进行安全判断,只有父引用原本指向的类型和与向下转型的类型一致,才能转
//  判断方法1:
        if(person instanceof German){
            German german = (German)person;
            german.build();
            System.out.println("german.location = " + german.location);
        }
        System.out.println("===============");
//  判断方法2:Chinese类字节码对象 == American类的字节码对象
        if(person.getClass() == American.class){
            American american = (American)person;
            american.hamburger();
            System.out.println("american.age = " + american.age);
        }
    }

}


interface Person{
    public abstract void talk();
}

class Chinese implements Person{
    String dialect;
    @Override
    public void talk() {
        System.out.println("中国人说汉语");
    }

    public void eat() {
        System.out.println("中国人很会吃美食");
    }
}

class American implements Person{
    int age;
    @Override
    public void talk() {
        System.out.println("美国人说英语");
    }

    public void hamburger() {
        System.out.println("美国人做的汉堡不错");
    }
}

class German implements Person{
    String location;
    @Override
    public void talk() {
        System.out.println("德国人说德语");
    }
    public void build() {
        System.out.println("德国人制造业很强");
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值