`
izuoyan
  • 浏览: 8934179 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Java对象类型转换的四个经验

 
阅读更多

    Java对象类型转换时Java开发中经常遇到的,本文向您介绍Java对象类型转换的一些技巧和注意事项,包括向上转型与向下转型都操作和主要点。

    一、向上转型与向下转型。

    对象类型的转换在Java语言平台中经常遇到,主要包括向上转型与向下转型操作。程序开发人员需要熟练掌握这两个转型的方法以及其中容易出错的地方。如何来了解这两个转型的区别呢?笔者认为,以一个现实的例子作为比喻,可能会更加的容易理解。

    如现在有动物、鸟类、燕子三个名词,他们之间有什么关系呢?通常我们都会说,燕子是特殊的鸟类,或者说燕子是鸟类的一种。为此,从对象的定义来看,鸟类就是一个父类,而燕子就是一个子类。或者说,燕子对象就是一个鸟类对象。笔者这里要强调的一点就是,由于燕子是鸟类的一个对象,所以鸟类所具有的特性燕子全部具有。而燕子所具有的特性(如迁徙)则鸟类不一定都具有。在这个例子中,燕子也是一种鸟类。为此可以将燕子的对象堪称是一个鸟类的对象。这种方法在Java语言环境中就叫做“向上转型”。从这个例子中可以看出,向上转型是一个从较抽象类型的类(鸟类)向比较具体的类(燕子)过度。由于具体类(燕子)具有抽象类(鸟类)的全部特性,所以在这个转换过程中是不会有问题的。这就好像一个逻辑判断题说燕子是鸟类的一种,其具有鸟类的全部特性。这个命题至少到现在为止是完全正确的。

    但是,在实际工作中,我们还经常会遇到向下转型的情况。也就是说从一个抽象类中(鸟类)引用具体类(燕子)中的对象。也就是说,我们可以说燕子是鸟类的一种。但是现在反过来,如果说鸟类就是燕子,那显然就是以偏概全了,因为燕子并不具有其他鸟类的特性。如鸽子的特性燕子就没有。所以,在应用程序开发中,如果将父类对象赋值给子类的对象,就可能有问题。如果硬要这么做的话,则很有可能发生编译器错误。因为父类对象并不一定是子类的实例。这是什么意思呢?即所说的鸟类(父类对象)并不一定是子类对象(燕子)。因为鸟类对象还有可能是鸽子、白鹭等等。所以,如果将父类对象给子类对象的话,那么就会出现问题。

    二、如何实现向下转型?

    由于向上转型一般都是安全的,即将一个子类对象直接赋值给父类对象,一般被认为是安全的,如燕子是鸟类在哪里都是成立的。所以在向下转型时不需要采用其他的关键字,我们常常把向下转换叫做隐式转换。但是在这里向上转换是一种不安全的转换方式,如说鸟类就是燕子,这种说法无论在哪里都说不过去。为此默认情况下,进行向下转型时,往往会发生编译器错误。

    一般情况下,越是具体的对象所具有的特性越多。如燕子的特性就比鸟类的特性多的多。而越抽象的对象反而具有的特性越少,因为其只具有一些抽象对象的共性特征。在进行向下转型操作时,将特性范围小的对象转换为特性范围大的对象肯定会出现问题。为此在向下转型时,必须确保转换后不会出现问题,即具体对象的特性在抽象对象中也全部具备,只有如此才能够进行转换。而且即使满足这个条件,编译器也不不能够进行隐式转换。而是需要采用关键字进行强制转换。如子类对象名字=(子类名)父类对象名字。如果上面这个语法,就可以实现对象类型的强制转换。

    笔者在此强调一遍,在进行向下转型时一定要进行强制转换。即通过子类对象名字=(子类名)父类对象名字进行赋值,而不能够向向上转型那样进行隐式转换。

    三、确保向下转型的准确性。

    从以上分析中可以看出,向下转型往往被认为是不安全的。当在程序中执行向下转型操作的时候,如果父类对象不是子类对象的实例,就会发生编译器错误。所以在执行向下转型之前要先作一件事情,就是判断父类对象是否为子类对象的实例。也就是说,先要想一想,燕子就是鸟类这个命题是否成立(在某些特定的情况下这个伪命题可能会成立,如燕子的特性与鸟类的特性完全一致)。只有如此,向下转型才不会出现问题。在进行向下转型操作时,将特性范围小的对象转换为特性范围大的对象肯定会出现问题。但是,如果两个转换的对象特性范围一样大的话,可那么就不会有问题了。

    在应用程序开发中,往往通过操作符instanceof来完成这个判断。即可以利用这个操作符来判断是否一个雷实现了某个接口,也可以用来判断一个实例对象是否属于一个类。这个操作符的基本格式为:A(某个类的对象引用) instanceo(操作符号) B (某个类的名称)。这个操作符最后返回的是一个布尔值。如果是false的话,则说明A对象不是类B的实例对象。相反,如果返回的值是true的话,则说明对象A是类B的实例对象。

    四、向下转型的注意事项。

    在进行向下转型时,需要注意以下几方面的内容:

    一是要慎用向下转型。由于向下转型容易出问题,为此不到万不得已的时候,最好不用使用向下转型。条条道路通罗马,如果在编程之前,合理规划类,往往可以避免向下转型的发生。只有其他路走不通的情况下,才考虑通过向下转型的技术来解决问题。

    二是在进行向下转型的时候,需要做两件事情。一是一定要使用instanceof操作符来判断转型的合法性,即判断父类对象是否为子类对象的实例。这就好像在编写四则运算时,要判断除数不为零一样。这是必须要做的。也是程序员必须要养成的一个习惯。在进行向下转型时,就自然而然会想到需要进行这个判断。只有如此,应用程序的错误才能够降低。而且还能够满足不同的需求。二是需要注意向上转型与向下转型的区别。一般情况下,向上转型往往被认为是安全的,所以在Java语言平台中向上转型采用的是隐式转型。而向下转型由于特性范围大小的不同,为此往往被认为是不安全的。故系统默认情况下进行向下转型时必须采用强制转型的方式。如果不采用强制转型,则即使满足向下转型的条件,其也会发生编译器错误。所以需要切记,向下转型必须要采用强制转型。

    三是需要做好备注等注释工作。由于像向下转型等操作是容易出现问题的地方。为此在进行类似的操作时,最好在行注释或者块注释中能够进行说明。这对于后续的维护与代码的升级是很有帮助的。好记性不如烂笔头。如果没有做好相关注释的话,这次可能没有问题,但是下次再代码升级或者其他原因需要调整或者重写原有的代码时,就可能会因为疏忽而导致转型的失败。

    最后笔者再次提醒各位程序员,向上转型大家可以放心大胆的用。但是在使用向下转型技术时,大家要慎重,要按部就班(先判断后使用)的进行操作。

分享到:
评论

相关推荐

    JSON 字符串 与 java 对象的转换

    JSON 字符串 与 java 对象的转换 包括说明代码和需要的jar包 commons-beanutils-1.7.0.jar commons-lang-2.1.jar ezmorph-1.0.2.jar json-lib-1.1-jdk15.jar 之前找了一些,说是只需要引入json-lib-1.1-jdk15.jar...

    Java面向对象程序设计笔记

    Java面向对象程序设计笔记: 目录----非原创,上课的时候老师给的资料哦 第一章 Java 前凑 3 1. Java前凑 3 Java产生的目的 3 Java的诞生的历史 3 2.Java语言的特点 3 简单性 3 面向对象 3 网络技能 3 3....

    JAVA上百实例源码以及开源项目

     Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥...

    JAVA上百实例源码以及开源项目源代码

     Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥...

    Thinking in Java 中文第四版+习题答案

    A.1.3 传递和使用Java对象 A.1.4 JNI和Java违例 A.1.5 JNI和线程处理 A.1.6 使用现成代码 A.2 微软的解决方案 A.3.1 @dll.import引导命令 A.3.2 com.ms.win32包 A.3.3 汇集 A.3.4 编写回调函数 A.3.5 其他J/Direct...

    java开源包11

    一个Java远程调用框架,它将原生Java对象序列化压缩装入HTTP中。它是 Spring HttpInvoker的一个轻量级选择,特别适合于当你不想在客户端程序中使用Spring框架。 API访问授权的开放标准 OAuth OAuth 协议为用户资源...

    java开源包6

    一个Java远程调用框架,它将原生Java对象序列化压缩装入HTTP中。它是 Spring HttpInvoker的一个轻量级选择,特别适合于当你不想在客户端程序中使用Spring框架。 API访问授权的开放标准 OAuth OAuth 协议为用户资源...

    java开源包9

    一个Java远程调用框架,它将原生Java对象序列化压缩装入HTTP中。它是 Spring HttpInvoker的一个轻量级选择,特别适合于当你不想在客户端程序中使用Spring框架。 API访问授权的开放标准 OAuth OAuth 协议为用户资源...

    java开源包4

    一个Java远程调用框架,它将原生Java对象序列化压缩装入HTTP中。它是 Spring HttpInvoker的一个轻量级选择,特别适合于当你不想在客户端程序中使用Spring框架。 API访问授权的开放标准 OAuth OAuth 协议为用户资源...

    java开源包101

    一个Java远程调用框架,它将原生Java对象序列化压缩装入HTTP中。它是 Spring HttpInvoker的一个轻量级选择,特别适合于当你不想在客户端程序中使用Spring框架。 API访问授权的开放标准 OAuth OAuth 协议为用户资源...

    java开源包5

    一个Java远程调用框架,它将原生Java对象序列化压缩装入HTTP中。它是 Spring HttpInvoker的一个轻量级选择,特别适合于当你不想在客户端程序中使用Spring框架。 API访问授权的开放标准 OAuth OAuth 协议为用户资源...

    JAVA面试题最全集

    1.Java有那些基本数据类型,String是不是基本数据类型,他们有何区别。 2.字符串的操作: 写一个方法,实现字符串的反转,如:输入abc,输出cba 写一个方法,实现字符串的替换,如:输入bbbwlirbbb,输出...

    java开源包8

    一个Java远程调用框架,它将原生Java对象序列化压缩装入HTTP中。它是 Spring HttpInvoker的一个轻量级选择,特别适合于当你不想在客户端程序中使用Spring框架。 API访问授权的开放标准 OAuth OAuth 协议为用户资源...

    java开源包10

    一个Java远程调用框架,它将原生Java对象序列化压缩装入HTTP中。它是 Spring HttpInvoker的一个轻量级选择,特别适合于当你不想在客户端程序中使用Spring框架。 API访问授权的开放标准 OAuth OAuth 协议为用户资源...

    java学习笔记-java思维导图流程图表格整理

    数组的四个基本特点 27 二维数组 27 Arrays类 28 稀疏数组 29 面向对象编程 32 值传递和引用传递 33 创建和初始化对象 34 封装 34 继承 37 super 37 方法重写 39 多态 39 instanceof和类型转换 40 instanceof 40 ...

    java开源包3

    一个Java远程调用框架,它将原生Java对象序列化压缩装入HTTP中。它是 Spring HttpInvoker的一个轻量级选择,特别适合于当你不想在客户端程序中使用Spring框架。 API访问授权的开放标准 OAuth OAuth 协议为用户资源...

    java开源包1

    一个Java远程调用框架,它将原生Java对象序列化压缩装入HTTP中。它是 Spring HttpInvoker的一个轻量级选择,特别适合于当你不想在客户端程序中使用Spring框架。 API访问授权的开放标准 OAuth OAuth 协议为用户资源...

    java核心知识点整理

    3.Java是典型的强类型语言,即必须声明变量的类型,Java中有8种类型,6种数值类型(4个整数型和2个浮点型)、一个字符类型和一个boolean类型。 想学习java可以来这个群,首先是二二零,中间是一四二,最后是九零六...

    java jdk实列宝典 光盘源代码

    java为数据结构中的映射定义一个接口java.util.Map,有四个实现类HashMap Hashtable LinkedHashMap TreeMap用法和区别;对Map排序; 5字符串 使用String;判断一个字符串是否是合法的java标识符;使用StringBuffer;...

    深入Java虚拟机(原书第2版).pdf【附光盘内容】

    《深入Java虚拟机(原书第2版)》,原书名《Inside the Java Virtual Machine,Second Edition》,作者:【美】Bill Venners,翻译:曹晓钢、蒋靖,出版社:机械工业出版社,ISBN:7111128052,出版日期:2003 年 9 ...

Global site tag (gtag.js) - Google Analytics