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~~~");

    }
}

最终结果实现如下:

Java中向上转型和向下转型的理解_第1张图片

你可能感兴趣的:(自创1,java,开发语言,后端)