向上转型和向下转型

其实这是一个很简单的问题,也很容易理解的,今天遇到一个同事问我子类怎么不能转父类,这些是在刚学C语言的时候应该就教过了!其实如果非要把两个类关联起来也并不一定要

继承,把一个类做成另一个类的属性也可以,当然如果父类是自己写的或是调用的方法中是可以自己实例化的话,那用向下转型就可以了,但是在使用向下转型的时候,请一定要记住

父类对象一定是子类对象的实例才可以转哦!

package com.taobao.frame.common;

public class Demo {
    
    public static void main(String[] args) {
        /**
         * 向上转型   狗是动物
         */
        Animal species = new Dog();
        species.say();
    } 
}
/**
 * 动物
 */
class Animal{
    
    public void say(){
        System.out.println("动物在说话...");
    }
}
/**
 * 狗
 */
class Dog extends Animal{
    
    public void say(){
        System.out.println("狗在说话...");
    }
}

这是向上转型的方法,这种应该是用得最多的了。打印出来当然也就是“狗在说话...”啦!很多人想向下转型不过就是把父类转成子类,可能有些人在main方法中就会这样写

    public static void main(String[] args) {
        /**
         * 向下转型   动物是狗     Animal cannot be cast to Dog
         */
        Dog species = (Dog) new Animal();
        species.say();

    } 

编译的时候不会报错,但是从逻辑上也说不通,说动物就是狗,鸡是动物,那鸡也是狗吗?很显然不是的,所以在运行的时候就会报错,提示:Animal cannot be cast to Dog,动物不成强转成狗,不是要

向下转型吗?那当什么情况下能说动物是狗呢?当然也就是当你指明了那只动物是狗的情况下,你再说那只动物是狗,那肯定是没错的!所以代码应该如下:

    public static void main(String[] args) {

        /**
         * 向下转型    先指定那个动物是狗,再说那只动物是狗
         */
        Animal species = new Dog();
        if(species instanceof Dog){    //判断一下那只到底是不是狗
            species = new Dog();
            species.say();
        }
    } 

先向上转型,才可以向下转型,打印的结果自然也是:“狗在说话...”。

为此希望还模糊在向上转型和向下转型的童鞋,看到文章能有个大概了解。

原文地址:https://www.cnblogs.com/hnhcc39/p/2588784.html