zoukankan      html  css  js  c++  java
  • Java中的向上转型 & 向下转型 ( OOP )

    转型 例子

    分析和结论:

    (一)向上转型

    (1)定义:把对某个对象的引用视为对其基类引用的做法被称为“向上转型”。
    这主要是由于子类的对象可以看成是基类的对象这原因而得来的,也就是具有is-a关系。

    比如:
    Useful useful = new MoreUseful();//右边是一个子类的对象,而左边是一个父类类型
    //的变量,指向右边的子类对象。

    (2)导出类可以接收发给基类的任何消息,因为二者有完全相同的接口,我们只需要

    从导出类向上转型,永远不需要知道正在处理的对象的确切类型,这也就是多态性决

    定的。利用多态性,具有同样方法名和方法特征的方法根据调用方法的对象的类型,

    可以产生不同的动作,这极大地增加了程序员的表达能力。

    回头再看一看上面这个例子中的一段for循环代码,

    for(inti=0;i<x.length;i++)
    {
    if(x[i] instanceofMoreUseful2)  //判断instanceof左边的对象是否是右边的类的实例。
    {
    MoreUseful2 moreuseful2 =(MoreUseful2)x[i];  //向下转型(具体解释见下面的分析)
    moreuseful2.u();
    }

    x[i].g();//动态绑定
    }
    主要看x[i].g();这一句话,现在我们还不知道x[i]这个到底是指代哪一个Useful对象,

    在这种情况下,编译器是怎么知道调用哪个方法的呢?这是一个动态绑定的问题,见

    下面。

    (二)动态绑定

    (1)定义:将方法的调用和方法主体关联起来就是动态绑定。

    比如:x[i].g();这就是一个动态绑定,x[i]是一个对象类型,g()是一个不知道是属于

    哪个对象的方法,将这两个两个联合在一起,就是一个绑定。

    (2)要注意:Java中除了static和final方法(private方法属于final方法,因为fianl方法

    不可以覆盖,static方法是一个全局方法,属于所有类共享,不在多态范围内)之外,

    其他所有的方法都是动态绑定,这就意味着在通常情况下,我们不必判定是否应该进

    行动态绑定,因为这个会自动发生。

    (3)接着上面的答复。编译器是怎么知道调用哪个方法的呢?

    主要还是x[i].g();这一句话的作用,x[i]在调用方法的时候,会调用“实际”的方法,这

    个实际的方法由所引用的对象的类型决定。那么调用的实际方法可能是父类中没有被

    子类覆盖的方法,也可能是子类中覆盖父类的方法,主要看调用这个方法的实际的对

    象类型是哪一个。

    (三)向下转型

    既然有向上转型,那么有没有向下转型呢?

    答:有

    (1)概述

    继承可以确保所有的子类类具有基类的接口,且绝对不会少。那么子类除了有父类的

    方法,也可以有自己的额外的新方法(这些方法是基类所没有的),那么一旦向上转

    型,就不能调用子类中的新方法,那么能不能用一种方式调用这些新方法呢?当然有

    了,这时候就需要向下转型。

    (2)向下转型

    将超类的引用强制转换为子类类型就叫做向下转型。

    注意:将超类的引用赋给为子类类型的变量(没有进行显示地强制转换)是一个编译

    错误。

    例子:

    还是上面的for循环代码

    for(int i=0;i<x.length;i++)
    {
    if(x[i] instanceof MoreUseful2)//判断instanceof左边的对象是否是右边的类的实例。
    {
    MoreUseful2 moreuseful2 = (MoreUseful2)x[i];// 向下转型
    moreuseful2.u();
    }

    x[i].g();
    }

    分析:x[i]可以代表具体的Useful对象类型,当它是MoreUseful2或ExtendsMoreUseful2

    对象类型时,就可以调用该对象的额外方法u(),v(),w(),也就是当对象x[i]和Moreusful对

    象存在is-a关系时,才可以进行向下转型,如果要转换的对象类型与指定的对象类型不

    存在is-a关系时,会产生一个ClassCastException异常。

    总之:

    向下转型时,对象只能强制转换为其本身类型或者其超类类型。比如,

    当x[i]ExtendsMoreUseful2对象时,可以把他转换为其本身ExtendsMoreUseful2对象类

    型,也可以把它转换为其基类MoreUseful2类型。但是在编译时候还不知道这个x[i]是代

    表那个具体对象类型只知道这个x[i]是基类类型引用,所以要用这样的形式" (想要要得

    到的类型)x[i] " 进行转换。x[i]在这里是就我这个例子来说明的,你也可以使用其它的

    英文代替,其意义是一切符合规定的需要被转换的对象。

  • 相关阅读:
    从 http 升级到 https 过程中遇到的一些问题
    Java 对象,数组 与 JSON 字符串 相互转化
    jQuery 事件探秘
    eclipse 添加 hibernate 插件
    struts2 + jquery + json 简单的前后台信息交互
    匿名类、匿名方法、扩展方法
    禁用右键
    JS聊天室
    MVC知识汇总
    知识点汇总
  • 原文地址:https://www.cnblogs.com/moveofgod/p/2691058.html
Copyright © 2011-2022 走看看