Java-高级编程继承中向上转型(Upcasting)和向下转型(Downcasting)的简单理解

向上转型(Upcasting)和向下转型(Downcasting)是Java中经常使用的两种类型转换方式。

1.向上转型

向上转型是指将子类对象转换成父类类型,其实现原理是子类对象可以自动地转换为父类类型。这意味着一个类的变量可以引用该类或其任何子类的实例,并且可以调用父类或子类中重载的方法。

一个示例代码如下:

public class Animal {
    public void eat(){
        System.out.println("Animal is eating...");
    }
}

class Dog extends Animal{
    @Override
    public void eat(){
        System.out.println("Dog is eating...");
    }

    public void bark(){
        System.out.println("Dog is barking...");
    }
}

public class Main{
    public static void main(String[] args) {
        Animal animal = new Dog(); // 向上转型
        animal.eat();  // 调用 Dog 中重写的 eat() 方法
        //animal.bark();  // 编译器报错,Animal 类没有 bark() 方法
    }
}

}

2.向下转型

向下转型是指将父类对象转换成子类类型。在Java中,使用向下转型必须先进行向上转型,也就是将父类对象强制转换成子类对象。需要注意的是,如果父类对象不是子类对象,此时转换会出现ClassCastException异常。

向下转型可以在某些情况下方便使用子类特有的方法或属性,因此有一些应用场景:

1.多态性后需要使用子类的方法

如果一个父类变量被赋值为子类对象,在调用该变量时,只能使用父类中定义的方法。如果需要调用子类中添加的方法,则必须通过向下转型将父类变量转换为子类对象,从而实现调用子类方法。

2.子类对象的动态绑定

向下转型也是动态绑定的一部分,即在运行时确定调用的方法和属性。通过向下转型,可以实现对特定子类对象进行操作,并且这些操作在程序运行时才会被确定。

3.接收用户输入并确定对象类型

当需要接收用户输入来确定对象类型时,向下转型可以非常有用。例如,当用户输入“Dog”时,我们可以将其转换为Dog类的对象,并使用向下转型将其转换为Dog对象,从而实现更多操作。

虽然向下转型可以方便地使用子类特有的方法和属性,但需要注意的是,在未进行类型检查时进行错误的向下转型可能会引发异常,因此在使用时必须非常谨慎。

一个示例代码如下:

public class Animal {
    public void eat(){
        System.out.println("Animal is eating...");
    }
}

class Dog extends Animal{
    @Override
    public void eat(){
        System.out.println("Dog is eating...");
    }

    public void bark(){
        System.out.println("Dog is barking...");
    }
}

public class Main{
    public static void main(String[] args) {
        Animal animal = new Dog(); // 向上转型

        if(animal instanceof Dog){  // 判断 animal 是否可以向下转型为 Dog 类
            Dog dog = (Dog) animal; // 向下转型
            dog.eat();
            dog.bark();
        }else{
            System.out.println("animal 不是 Dog 的实例");
        }
    }
}

需要注意的是,向下转型是存在一定的风险和局限性的。所以我们应该在必要的情况下谨慎地使用向下转型并且避免出现ClassCastException异常的情况。

以上代码和部分理解引用自Java 继承 | 菜鸟教程 (runoob.com)

时间:2023/04/03-21点04分,以上仅为个人对Java高级编程中继承这一章节的学习记录,有错误欢迎各位指出,交流学习!感谢观看

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Stevedash

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

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

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

打赏作者

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

抵扣说明:

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

余额充值