向上转型和向下转型

本文通过实例代码详细讲解了Java中的向上转型和向下转型。向上转型允许父类引用指向子类对象,但会丢失子类特有的方法,如需调用子类特有方法需进行向下转型。然而,错误的向下转型会导致ClassCastException。
摘要由CSDN通过智能技术生成

​ 强制转换知识

向上转型

  • 安全的
  • 父类引用指向子类对象(子赋值父)
  • 猫是动物

一旦向上转型为父类则不可调用子类特有方法
animal.catchMouse()报错
(但是我又想调用子类方法呢?—还原成子类。向下转型

总结构

总结构

1.Animal类

package com.jiang.obj;

public abstract class Animal {

    public abstract void eat();
}

2.Cat类

package com.jiang.obj;

public class Cat extends Animal{
    @Override
    public void eat() {
        System.out.println("猫吃鱼");
    }

    //子类特有方法
    public void catchMouse(){
        System.out.println("猫抓老鼠");
    }
}

3.测试

package com.jiang.obj;

public class Demo01main {
    public static void main(String[] args) {
        //父指子
        Animal animal = new Cat();
        animal.eat();
    }

}

4.结果:

"C:\Program Files\Java\jdk1.8.0_291\bin\java.exe" "-javaagent:D:\IDEA\IntelliJ IDEA 2020.3.3\lib\idea_rt.jar=65394:D:\IDEA\IntelliJ IDEA 2020.3.3\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_291\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\rt.jar;D:\IDEA_Project\XML\target\classes;C:\Users\JR2002\.m2\repository\org\dom4j\dom4j\2.1.3\dom4j-2.1.3.jar;C:\Users\JR2002\.m2\repository\jaxen\jaxen\1.2.0\jaxen-1.2.0.jar" com.jiang.obj.Demo01main
猫吃鱼

Process finished with exit code 0

向下转型

注意:猫向上转成animal,animal还原成cat,不可还原成dog(classcastexception错误)

1.添加了一个Dog类

package com.jiang.obj;

public class Dog extends Animal{
    @Override
    public void eat() {
        System.out.println("狗吃shi");
    }
    public void watchHouse(){
        System.out.println("狗看家");
    }
}

2.测试类

package com.jiang.obj;

public class Demo01main {
    public static void main(String[] args) {
        //父指子
        Animal animal = new Cat();
        animal.eat();
        //animal.catchMouse(); 报错
        //一旦向上转型为父类,则不可调用子类特有方法???
        //怎么办呢?(还原)本来是猫,向上成动物,还原
        Cat cat=(Cat) animal;
        cat.catchMouse();
        //错误的,本来是猫,还原成了狗
        Dog dog=(Dog) animal;//classcastException 类转换异常
    }

}

3.结果

"C:\Program Files\Java\jdk1.8.0_291\bin\java.exe" "-javaagent:D:\IDEA\IntelliJ IDEA 2020.3.3\lib\idea_rt.jar=49239:D:\IDEA\IntelliJ IDEA 2020.3.3\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_291\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\rt.jar;D:\IDEA_Project\XML\target\classes;C:\Users\JR2002\.m2\repository\org\dom4j\dom4j\2.1.3\dom4j-2.1.3.jar;C:\Users\JR2002\.m2\repository\jaxen\jaxen\1.2.0\jaxen-1.2.0.jar" com.jiang.obj.Demo01main
猫吃鱼
猫抓老鼠
Exception in thread "main" java.lang.ClassCastException: com.jiang.obj.Cat cannot be cast to com.jiang.obj.Dog
	at com.jiang.obj.Demo01main.main(Demo01main.java:14)

Process finished with exit code 1

定义一个接口(弄个A方法),new接口 = new 子类。 使用子类的A方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值