JAVA向下转型的错误示例和正确示例

多态的向上向下转型都是针对于编译时类型,运行时的类型从始至终都不会改变,即在new的时候创建是哪个类型的对象就是哪个类型的对象。
向上转型导致“向父类转型的子类对象调用子类特有方法”即使运行时无错也无法通过编译,若想调用子类特有方法应该解决此编译出错问题。

  • 解决方法:向下转型。将经历过向上转型的子类对象再强制“转回来”。
  •               转回来意思是,不能转成除本子类以外的其他类。如果转成除本子类以外的其他类,编译不报错但运行时会出现ClassCastException
    
package poly;

/*
 * 向上转型导致“向父类转型子类对象调用子类特有方法”即使运行时无错也无法通过编译,若想调用子类特有方法应该解决此编译出错问题。
 * 解决方法:向下转型。将经历过向上转型的子类对象再强制“转回来”。
 *                   转回来意思是,不能转成除本子类以外的其他类。如果转成除本子类以外的其他类,编译不报错但运行时会出现ClassCastException
 * */
public class DownCast {
    public static void main(String[] args) {
        /*错误向下转型:将没向上转型的父类对象转到子类*/
        Person3 per1 = new Person3();
//        Chinese3 chi1 = (Chinese3) per1;	//编译不报错但运行时会出现ClassCastException
//        chi1.uniqueMethod();
        /*使用instanceof判断能否向下转型*/
        System.out.println(per1 instanceof Chinese3);
        if (per1 instanceof Chinese3) {
            Chinese3 chi1 = (Chinese3) per1;
            chi1.uniqueMethod();
        }

        /*错误向下转型:将向上转型的子类对象转到了其他子类*/
        Person3 per4 = new Chinese3();
//        Janpan3 jan2 = (Janpan3) per4;	//编译不报错但运行时会出现ClassCastException
//        jan2.uniqueMethod();
        /*使用instanceof判断能否向下转型*/
        System.out.println(per4 instanceof Janpan3);
        if (per4 instanceof Janpan3) {
            Janpan3 jan2 = (Janpan3) per4;
            jan2.uniqueMethod();
        }

        /*正确向下转型:将向上转型的子类对象转回来*/
        Person3 per2 = new Chinese3();
//        Chinese3 chi2 = (Chinese3) per2;	//正确使用,编译和运行都不报错
//        chi2.uniqueMethod();
        System.out.println(per2 instanceof Chinese3);
        if (per2 instanceof Chinese3) {
            Chinese3 chi2 = (Chinese3) per2;
            chi2.uniqueMethod();
        }
    }
}

class Person3 {
    public void eat() {
        System.out.println("人吃饭");
    }
}

class Chinese3 extends Person3 {
    @Override
    public void eat() {
        System.out.println("中国人吃饭");
    }

    public void uniqueMethod() {
        System.out.println("中国人特有方法");
    }
}

class Janpan3 extends Person3 {
    @Override
    public void eat() {
        System.out.println("日本人吃饭");
    }

    public void uniqueMethod() {
        System.out.println("日本人特有方法");
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我的Y同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值