Java常用类型转换及转换陷阱

  • 2021年10月29日
  • Java

package com.longlonggo.test;

/**
 * <p>Description:	Java常用类型转换</p>
 * <p>Created on	2017年9月19日 下午7:48:30</p>
 * <p>Copyright:	Copyright (c) 2017-2018</p>
 * @author			石马人山  me@longlonggo.com
 * 
 */
public class JavaClass {

	public static void main(String[] args) {
		//Java中的八种基本数据类型,六种数字类型(四个整数型,两个浮点型),一种字符类型和一种布尔型。 
		byte b = 1;
		short s = 1;
		int i = 1;
		long l = 1L;
		float f = 1F;
		double d = 1D;
		char cstr = 'a';
		char cint = '1';
		boolean a = true;
		
		//一)Java基本数据类型转换
		// 【自动类型转换/隐式类型转换】编译器自动完成类型转换,不需要在程序中编写代码
		// 从存储范围小的类型到存储范围大的类型:byte→short(char)→int→long→float→double
		s = b;		//byte→short		【正确】编译器通过
		i = s;		//short→int			【正确】编译器通过
		l = i;		//int→long			【正确】编译器通过
		f = l;		//long→float		【正确】编译器通过
		d = f;		//float→double		【正确】编译器通过
		i = cstr;	//char→int			【正确】编译器通过,这里char类型的cstr并不是a的字符,而是ASCII的值
		
		// 	【强制类型转换/显示类型转换】强制编译器进行类型转换,必须在程序中编写代码。该类型转换很可能存在精度的损失
		// 	从存储范围大的类型到存储范围小的类型:double→float→long→int→short(char)→byte
//		b = s;				//short→byte	【错误】编译器报错,提示:"Type mismatch: cannot convert from short to byte"
		b = (byte) s;		//short→byte	【正确】大范围类型转换小范围类型,需要进行显示的强制转换
		s = (short) i;		//short→int		【正确】大范围类型转换小范围类型,需要进行显示的强制转换
		i = (int) l;		//int→long		【正确】大范围类型转换小范围类型,需要进行显示的强制转换
		l = (long) f;		//long→float	【正确】大范围类型转换小范围类型,需要进行显示的强制转换
		f = (float) d;		//float→double	【正确】大范围类型转换小范围类型,需要进行显示的强制转换
		cstr = (char) i;	//char→int		【正确】大范围类型转换小范围类型,需要进行显示的强制转换
		
		//二)Java基本数据类型和包装类之间的转换
		Integer iBig = new Integer(i);		//int→Integer 方式一 整形转包装类
				iBig = Integer.valueOf(i);	//int→Integer 方式二 整形转包装类
				iBig = i;					//int→Integer 方式三 整形转包装类
				
				i = iBig.intValue();		//Integer→int 方式一 包装类转整形(该处有坑,将在下面三种细说)
				i = iBig;					//Integer→int 方式二 包装类转整形,JDK1.5以上版本可以实现自动装箱拆箱,JDK帮我们自动实现转换,不需要强转。
		
		
		//三)Java数据类型其他知识
		System.out.println("字面值cstr:"+cstr+", ASCII值:"+(int)cstr);	//输出结果:字面值cstr:a, ASCII值:97
		System.out.println("字面值cint:"+cint+", ASCII值:"+(int)cint);	//输出结果:字面值cint:1, ASCII值:49

		//怪异的包装类比较结果,123比较结果是true, 123456比较结果是false,很神奇有木有!
		//原因是Integer类的值如果是-127<=val<=128,JDK的自动装箱池在这个范围内的Integer值,都会缓存在内存中,直接比较的是缓存的值
		//而超过这个范围后重新申请内存地址空间,所以两个对象的比较结果是false
		Integer i1 = 123;
		Integer i2 = 123;
		System.out.println("Integer类型123==123比较结果:"+(i1==i2));		//输出结果:Integer类型123==123比较结果:true
		i1 = 123456;
		i2 = 123456;
		System.out.println("Integer类型123456==123456比较结果:"+(i1==i2));	//输出结果:Integer类型123==123比较结果:false
		
	}

}

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注