JAVA 的多态里的向下转型和向上转型问题,附带 instanceof 运算符

本文介绍了JAVA中的多态基础语法,包括向上转型和向下转型的概念及其区别。向上转型允许从子类到父类的转换,而向下转型则从父类转到子类,但存在风险,可能导致ClassCastException。为了避免此类错误,可以使用instanceof运算符在运行时动态判断对象类型。文章通过实例解释了instanceof的用法及其返回结果的意义。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

多态的基础语法

向上,向下转型

这里先说两个概念:

  • 向上转型:是指从子类到父类
  • 向下转型:是从父类转到子类

JAVA 中允许向上转型和向下转型。但是他们之间必须是有继承的关系

向上转型
Animal a = new Cat();
向下转型

如果想访问的方法,在父类中没有,是子类中特有的,就必须使用向下转型了(强制类型转换)
比如下例中,cat 中的抓老鼠方法是特有的

public class demo1 {
    public static void main(String[] args) {
        Animal c = new Cat();
        Cat d = (Cat)c;//这里使用向下转型
        d.catchMouse();
    }
}

class Cat extends Animal{
    @Override
    public void move() {
        System.out.println("cat is talking!");
    }

    public void catchMouse(){
        System.out.println("catching mouse");
    }
}

但,向下转型是有风险的。经常会出现转换类型的错误。
例如:(编译可以通过但是并不能运行)
java.lang.ClassCastException类型转换的错误

public class demo1 {
    public static void main(String[] args) {
        Animal c = new Bird();
        Cat d = (Cat)c;//这里,会出现一个经典错误
        d.catchMouse();
    }
}

class Animal{
    public void move(){
        System.out.println("animal is running!");
    }
}

class Bird extends Animal{
    @Override
    public void move() {
        System.out.println("bird is flying!");
    }
}

class Cat extends Animal{
    @Override
    public void move() {
        System.out.println("cat is talking!");
    }

    public void catchMouse(){
        System.out.println("catching mouse");
    }
}

因为 c 里面其实是鸟,但是他强制转换为了猫。可是猫和鸟之间是没有继承关系的。只有动物和它们之间存在,于是不能出现向下转型

instanceof 运算符

避免问题的方法,就是使用 instanceof 的运算符

  • instanceof 它可以在运行阶段动态判断引用指向的对象的类型

  • instanceof 的语法(引用 instanceof 类型)

  • instanceof 的运算结果只能是 true/false

  • c 是一个引用,c 变量保存了内存地址指向了堆中的对象。
    假设(c instanceof Cat)为 true 表示:c 的内存地址指向的是一个 Cat 类型。

    假设(c instanceof Cat)为 false 表示:不是一个 Cat 类型的。

public class demo1 {
    public static void main(String[] args) {
        Animal c = new Bird();
        if (c instanceof Cat) {//那么就这样做一个判断
            Cat d = (Cat)c;
            d.catchMouse();
        }else {
            System.out.println("转换失败");
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值