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 } }