zoukankan      html  css  js  c++  java
  • Java向上转型和向下转型

    首先定义父类Animal,所有动物都有一个吃东西的方法;子类Dog还增加了一个叫的功能。

    public class Animal {
     
        public void eat() {
            System.out.println("eat like an animal");
        }
    }
    public class Dog extends Animal {
     
        @Override
        public void eat() {
            System.out.println("eat like an dog");
        }
     
        public void barking() {
            System.out.println("dog like barking");
        }
    }

    1、向上转型

    向上转型(upcasting):子类引用的对象转换为父类类型。

    向上转型转型时,父类指向子类引用对象会遗失除与父类对象共有的其他方法,也就是在转型过程中,子类的新方法都会遗失掉,在编译时,系统会提供找不到方法错误。

    public class Demo {
        public static void main(String[] args) {
            // upcasting
            Animal animal = new Dog();
            animal.eat();
            // animal.barking(); The method barking() is undefined for the type Animal
        }
    }

    2、向下转型

    在向下转型过程中,分为两种情况:

    情况一:如果父类引用的对象的引用是指向的子类对象,那么在向下转型的过程中是安全的。也就是编译是不会出错误的。

    情况二:如果父类引用的对象是父类本身,那么在向下转型的过程中是不安全的,编译不会出错,但是运行时会出现java.lang.ClassCastException错误。它可以使用instanceof来避免出错此类错误。

    public class Demo {
        public static void main(String[] args) {
            Animal animal = new Dog();
            // 情况1
            Dog dog1 = (Dog) animal;
            dog1.eat();
            dog1.barking();
            // 情况2
            Dog dog = (Dog) new Animal();
            dog.eat();
        }
    }

    运行结果:
    eat like an dog
    dog like barking

    Exception in thread "main" java.lang.ClassCastException: demo.Animal cannot be cast to demo.Dog
    at demo.Demo.main(Demo.java:12)

    总结:

    1、 父类引用可以指向子类对象,子类引用不能指向父类对象。

    2、 向上转型不用强制转型。

    3、 向下转型要强制转型。

    4、 Upcasting会丢失子类特有方法,子类重写的父类方法有效。
    ————————————————


    版权声明:本文为CSDN博主「犁叔」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/u012739535/article/details/45249853

  • 相关阅读:
    FtpClient中文乱码问题解决
    JS点击按钮弹出窗口
    win7配置简单的FTP服务器
    docker 使用案例:部署nginx
    Asp.Net Boilerplate Project (ABP) 视频教程
    dva.js 用法总结
    webpack4: compilation.mainTemplate.applyPluginsWaterfall is not a function 解决方法
    c# MongoDB Driver 官方教程翻译
    c# redis 操作类库推荐:StackExchange.Redis.Extensions
    react-native导航器 react navigation 介绍
  • 原文地址:https://www.cnblogs.com/nio-nio/p/13231518.html
Copyright © 2011-2022 走看看