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