`
xwood
  • 浏览: 103811 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

JAVA中的类型转换问题

阅读更多
    虽然在Java中有N种情况的数据类型转换,但从从内存处理的角度来说,其实都是一个问题——变量的可见范围,也就是这个变量所代表的内存区域。下面就从以下四个方面说明一下。

一、强制类型转换
    强制类型转换是体现这范围变化最明显的地方。
    强制类型是指基本数据类型从占用内存多的向占用内存少的类型转换。比如64bit的long向32bit的int转换。假设Java采用低位优先(还有待查明,验证)存储数据,则在从long转为int的过程中,其高位32bit的数据就会被隐藏或者叫截断,因为系统认为int类型只有32bit,所以,它在访问int类型的数据的时候也只会访问32bit的内存。这样,剩下的32bit就直接被忽略掉了。这也是为什么我们在进行强制类型转换的时候需要人为控制,或者两种相互转换的类型大小相同的原因。具体可运行如下示例代码:
  /*
		 * 1.引用类型间的强制转换
		 * 转换之间的两个数据的原类型(原类型是指数据本身的类型,如 A a = new B(),则a的实际类型为B而非A)必须是可转换关系,
		 * 即转换的目标类型与被转换类型相同,或者转换的目标类型是被转换类型的父类,这种情况称为“向上转型”
		 */
		//(一)转换的目标类型与被转换类型相同
		Object a = new Object();
		a = new BigDecimal(1.0);
		try{
			String b = (String)a;
		}catch(ClassCastException e){
			System.out.println("error1 -- program throws a error when Object a is casted to String b.");
		}
		try{
			BigDecimal c = (BigDecimal)a;
		}catch(ClassCastException e){
			System.out.println("error2 -- program throws a error when Object a is casted to BigDemal c.");
		}
		
		//(二)转换的目标类型与被转换类型存在继承关系
		a = new HashMap();
		try{
			Map b = (Map)a;
		}catch(ClassCastException e){
			System.out.println("error3 -- program throws a error when Object a is casted to Map b.");
		}
		
		try{
			LinkedHashMap c = (LinkedHashMap)a;
		}catch(ClassCastException e){
			System.out.println("error4 -- program throws a error when Object a is casted to LinkedHashMap c.");
		}
		
		/*
		 * 2.基本类型间的强制转换
		 */
		float aa = 1.0f;
		int bb = (int)aa;
		System.out.println("int type bb :" + bb);
		double cc = (double)aa;
		System.out.println("double type cc:" + cc + "-------size:");


二、自动转换
    当占用内存少的数据类型向占用内存多的数据类型转换的时候,我们称为自动转换。它和强制类型转换恰好是一个相反的过程。强制类型转换是将高位数据截去,而自动转换则是为小数据类型分配更多的高位内存,以0填充。

三、向上转型
    在Java中还有向上转型与向下转型的说法,这主要是对类的继承而言。
    向上转型是指子类转型为父类,就好比让一只鸭子变成一只鸟,其实它本就是一只鸟。
    从内存范围的角度来说,假如鸭子类型需要取10个属性及5个方法的内存地址。那么这里面肯定包括鸟的3个属性地址及2个方法地址。所以,在整个转换过程中只是少取了一些内存地址而已。

四、向下转型
    向下转型也是需要人为控制的。它是指实体从父类型转换为子类型的过程。还以鸭子和鸟为例,这次就是把一只鸟变成一只鸭子了。如果这只鸟本就是一只鸭子,那这个过程还可以实现,就是把外面的伪装去掉,变成其原来的样子而已。但如果它不是一只鸭子,是一只麻雀。这就麻烦了。因为我们还得给它加些肉,羽毛也少了,还得加羽毛,还得变色。这是一个创造的过程,不得程序中一句下面的代码就可以完成的:
鸟 b = new 鸟();
鸭子 a = (鸭子) b;//b是一只鸟,它不是鸭子

    从内存范围的角度来说,不正确的向下转型就是要系统创造性的给转型后的实体加一些引用属性或方法的内存地址映射,但这个过程,系统是不知道如何去完成的,所以它就只能报错。






分享到:
评论

相关推荐

    java的Date类型转换成MySQL的DateTime类型.doc

    Java 中 Date 类型转换为 MySQL 的 DateTime 类型 Java 中的 Date 类型和 MySQL 的 DateTime 类型是两个不同的日期时间类型,都是用于表示日期和时间的信息,但它们之间存在一定的区别。Java 中的 Date 类型是使用...

    深入分析java中的类型转换

    ### 深入分析Java中的类型转换 #### 类型转换概述 类型转换是Java编程语言中的一个重要特性,它使得程序可以在不同类型的数据之间进行转换。在Java中,类型转换主要分为两大类:**隐式自动类型转换**和**强制手动...

    26.java自动类型转换.zip

    26.java自动类型转换.zip26.java自动类型转换.zip26.java自动类型转换.zip26.java自动类型转换.zip26.java自动类型转换.zip26.java自动类型转换.zip26.java自动类型转换.zip26.java自动类型转换.zip26.java自动类型...

    java 强制类型转换示例

    在Java编程语言中,强制类型转换是将一个数据类型转换为另一个兼容的数据类型的过程。这通常发生在处理不同类型的变量或对象之间需要交互的情况。在Java中,有两种类型的转换:自动类型转换(隐式转换)和强制类型...

    27.java强制类型转换.zip

    27.java强制类型转换.zip27.java强制类型转换.zip27.java强制类型转换.zip27.java强制类型转换.zip27.java强制类型转换.zip27.java强制类型转换.zip27.java强制类型转换.zip27.java强制类型转换.zip27.java强制类型...

    Java 多态中的类型转换

    本篇将深入探讨Java多态中的类型转换,包括向上转型(Upcasting)和向下转型(Downcasting),以及相关的注意事项。 1. **向上转型(Upcasting)** 向上转型是指将子类的对象引用赋值给父类的引用。在Java中,这是...

    Java中类型转换.pdf

    Java 中类型转换 Java 语言是一种静态类型语言,编程过程中的数据类型限制非常严格。因此,在编程过程中需要注意数据类型的转换。本文介绍了 Java 中的自动类型转换和强制类型转换的方法。 自动类型转换是指不需要...

    java中数据类型转换

    java中数据类型转换 收藏 java中数据类型转换 1如何将字串 String 转换成整数 int? A. 有两个方法: 1). int i = Integer.parseInt([String]); 或 i = Integer.parseInt([String],[int radix]); 2). int i =...

    25.java类型转换.zip

    25.java类型转换.zip25.java类型转换.zip25.java类型转换.zip25.java类型转换.zip25.java类型转换.zip25.java类型转换.zip25.java类型转换.zip25.java类型转换.zip25.java类型转换.zip25.java类型转换.zip25.java...

    JAVA数据类型转换.pdf

    本文档将详细介绍Java中的数据类型转换,包括简单数据类型之间的转换、字符串与其他数据类型的转换以及一些实用的数据类型转换技巧。掌握这些转换方法能够帮助开发者更灵活地处理不同类型的数据。 #### 二、数据...

    常见java中数据类型之间的转换.txt

    通过数据类型转换,可以确保不同数据类型之间的兼容性,并满足特定场景下的需求。本文将详细介绍Java中常见的数据类型及其之间的转换方法。 #### 1. `short` 到 `int` **示例代码**: ```java short shortVar = 0;...

    java类型转换参考大全

    ### Java类型转换详解 #### 一、概述 Java是一种强类型语言,在开发过程中经常会遇到不同数据类型之间的转换需求。为了确保程序的正确性和效率,掌握Java中的类型转换方法至关重要。本文将详细介绍Java中常见的...

    Java字符串类型转换

    Java中的字符串类型转换及其操作是一个广泛且深入的主题,涉及到基本类型转换、字符串内部操作、格式化处理以及高级类型转换等多个方面。掌握这些转换技巧对于编写高效、健壮的Java应用程序至关重要。通过合理运用...

    java之java类型转换

    Java 类型转换是 Java 编程语言中的一部分,它是 Java 编程的基础,但很多时候偏偏就会在这样的基础细节部分出错。Java 中的数据类型可以分为两大类:简单类型(Primitive)和引用类型(Reference)。简单类型变量中...

    Java基本类型转换.doc

    本文主要探讨Java中的基本类型转换,包括简单数据类型之间的转换、字符串与其他数据类型的转换以及一些实用的数据类型转换。 1. 简单数据类型之间的转换 Java中的简单数据类型包括布尔型(boolean)、字符型(char...

    java 数据类型转换

    在Java编程语言中,数据类型转换是至关重要的概念,它涉及到不同类型的变量之间的相互转化。Java分为两大类数据类型:基本数据类型(如int、char、float等)和引用数据类型(如类、接口和数组)。本文将深入探讨Java...

    JAVA类型转换[文].pdf

    Java 类型转换是编程过程中常见的操作,特别是在处理不同数据类型的变量时。Java 数据类型主要分为三大类:布尔型、字符型和数值型。数值型又细分为整型(byte、short、int、long)和浮点型(float、double)。此外...

    JAVA图片类型转换

    JAVA图片类型转换 实例. 如果需要在java中将 bmp 的图片转成 gif 格式的,可以参考一下这个例子。

    java中jython操作把python数据类型转成java类型

    下面将详细介绍如何在Java中使用Jython将Python数据类型转换为Java类型。 首先,Jython是Python的一个实现,它能够运行在Java平台上,通过Java虚拟机(JVM)执行。这意味着你可以直接在Java代码中调用Python函数...

Global site tag (gtag.js) - Google Analytics