Java中向上转型和向下转型的理解

本文探讨了Java中父子对象间的转换,包括向上转型(自动转换)和向下转型(强制转换)。通过示例代码详细解释了这两种转换方式,并展示了实际应用的实现结果。

父子对象之间的转换分为了向上转型向下转型,它们区别如下:

  • 向上转型 : 通过子类对象(小范围)实例化父类对象(大范围),这种属于自动转换
  • 向下转型 : 通过父类对象(大范围)实例化子类对象(小范围),这种属于强制转换

示例:Animal动物类代码解释如下:

package com.wjledu.poly_.detail_;

public class Animal {
    String name = "动物";
    int age = 10;
    public void sleep() {
        System.out.println("睡");
    }
    public void run() {
        System.out.println("跑");
    }
    public void eat() {
        System.out.println("吃");
    }
    public void show() {
        System.out.println("hello,您好");
    }
}

示例:Cat类继承Animal代码如下:

package com.wjledu.poly_.detail_;

public class Cat extends Animal{
    public void eat() {//方法重写
        System.out.println("猫吃鱼");
    }
    public void catchMouse() {//Cat特有方法
        System.out.println("猫抓老鼠");
    }
}

示例:Dog类继承Animal代码如下:

package com.wjledu.poly_.detail_;

public class Dog extends Animal{//Dog是Animal的子类
    
}

示例:PolyDetail实现两个对象类存在继承关系代码与注解如下:

package com.wjledu.poly_.detail_;

public class PolyDetail {
    public static void main(String[] args) {
        //多态的向上转型:父类的引用指向了子类的对象
        //语法:父类类型引用名 = new 子类父类();
        Animal animal = new Cat();
        Object obj = new Cat();//可以,因为Object 也是 Cat的父类

        //向上转型调用方法分规则如下:
        //(1) 可以调用父类所有的成员方法(需遵守访问权限)
        //(2) 但是不能调用子类的特有的成员。不能调用的原因如下:
        //(3) 因为在编译阶段,能调用哪些成员,是由编译类型来决定的
        //animal.catchMouse();//错误
        //(4) 最终运行结果看子类的具体实现,即调用方法时,按照从子类(运行类型)开始查找方法,
        //然后调用,规则和前面讲的方法调用规则一致。

        System.out.println("===========向上转型============");
        animal.eat(); //猫吃鱼
        animal.run(); //跑
        animal.show();//hello,您好
        animal.sleep();//睡


        //向上转型的总结:子类重写了父类方法,调用子类,没有重写掉
       //只要理解编译和运行这两个规则就不会绕晕了。

        //希望可以调用Cat的 catchMouse()方法
        //多态的向下转型
        //(1) 语法: 子类类型 引用名 = (子类类型)父类引用;
        //问题?cat的编译类型Cat,运行类型是Cat
        System.out.println("===========向下转型============");
        Cat cat = (Cat) animal;
        cat.catchMouse();//猫抓老鼠
        //(2)要求父类的引用必须指向的是当前目标类型的对象
        Dog dog = (Dog) animal;//不可以
        //只有编译类型和运行类型不一致才需要向下转型


        System.out.println("ok~~~");

    }
}

最终结果实现如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

江七.

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

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

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

打赏作者

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

抵扣说明:

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

余额充值