• 【Java学习笔记】上转型与下转型


    作者:gnuhpc
    出处:http://www.cnblogs.com/gnuhpc/

    见下边的程序段

    package test;
    class A {
        public String f(A obj)
        {
            return("A");
        }
    }
    class B extends A {
        public String f(B obj)
        {
            return("C");
        }
        public String f(A obj)
        {
            return("D");
        }
    }

    我们使用子类创建一个对象:

    B b = new B();

    然后再将这个子类的引用放到父类对象中:

    A a;

    a = b;

    那么这个父类对象a是子类对象b的上转型对象,对象的实体由子类负责建立,实质还是子类,只是损失了一些功能而已,这样的得失具体如下:

    得:上转型对象可以操作和使用子类继承或者重写的方法。

    失:上转型对象丧失了对子类新增成员变量或新增的方法的操作和使用。

     

    那么下边的这段测试代码的打印结果就是“D”,因为a2只能有public String f(A obj) 这个方法是可以用的。

    public class TestObj
    {
        public static void main(String args[])
        {  A a1 = new A();
            A a2 = new B(); //子类对象转化为父类,称为上转型,不需要强制转换。

            B b = new B();
            System.out.println(a2.f(b)); //“D”

            System.out.println();

     

             if (a2 instanceof B) {
                 B b1 = (B) a2;  //父类对象转化为下转型,此时需要使用强制转换,此时需要先判断要转换的这个对象(也就是a2指向的这个对象)是不是B类的实例
                System.out.println(b1.f(b));//"C"
                System.out.println(b1.f(a1));//"D"
            }
        }

     

    其实,java 转型问题其实并不复杂,只要记住一句话:父类引用指向子类对象。子类和父类中定义同名的变量时,仅仅是隐藏了,变量没有多态性;而对于覆盖的方法,Java表现出多态性,会调用更具体的子类里面的方法,无论从哪里调用,无论使用什么引用类型调用。


    另外说说向上转型的作用:由于向上转型的作用,在要传入子类实例的时候,我们可以方便的将父类实例作为参数定义在方法的传入参数上,这样不用利用多态特性进行方法的重载了。其实向上转型也是一种多态特性的体现。

    作者:gnuhpc
    出处:http://www.cnblogs.com/gnuhpc/

  • 相关阅读:
    简单的倒计时 时间显示
    git submodule
    使用选择器语法来查找元素
    yo bootstrap mui 使用对比
    flexbox 兼容安卓4.3
    mac 下 php 安装 中的坑
    微信网页开发
    能发送http请求(get,post)的工具
    h5宣传页制作过程中遇到的问题
    功能模块图、业务流程图、处理流程图、ER图,数据库表图(概念模型和物理模型)画法
  • 原文地址:https://www.cnblogs.com/gnuhpc/p/2844093.html
Copyright © 2020-2023  润新知