基础语法-数据类型转换
作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
一.数据类型自动提升与强制转换
1>.数据类型的自动提升(也称为隐式转换)
如果一个操作数中最大是int类型,所有的byte类型,short类型和char类型的值都将被提升到int类型。
如果一个操作数中最大是long类型,计算结果就是long类型
如果一个操作数中最大是float类型,计算结果就是float类型
如果一个操作数中最大是double类型,计算结果就是double类型。
综上所述,将数据类型存储成本较小的向存储成本较大转换方式我们称之为自动提升,官方术语也叫隐式转换。
2>.数据类型的手动提升(也称为显式转换)
和隐式转换相反,即将一个存储成本较大的转换成一个存储较小的数据类型就是我们所说的强制类型转换,也称为显式转换,温馨提示,这样的显式转换可能存在数据精准性的问题哟~
二.数据类型转换案例
/** * 数据类型转换 * @author 尹正杰 * */ public class Dome1 { public static void main(String[] args) { int x = 300; byte y = 20; /* * 由于x和y数据类型不一致,在两个数字做相加操作时JVM内部自动进行数据类型转换,即将byte转换成int类型; * * 这种由存储较成本类型较小的转换成存储成本较大的方式我们称之为隐式类型转换. */ x = x + y; System.out.println(x); int a = 300; byte b = 20; /* * 计算过程和上面类似,但是在赋值过程中等式右边的是int类型,而等式左边的是byte类型; * * 想要将存储成本较大的类型转换成存储成本较小的类型方式我们称之为强制类型转换(只不过这个步骤不是自动的,需要咱们人为去转换,也称为显示类型转换); * * 结算结果不一致案例刨析: * 而且显示类型转换可能会导致计算记过不准确,因为一个int类型是由4个字节进行存储,即32位,那么使用二进制标识320如下所示: * 00000000 00000000 00000001 01000000 * 而一个byte类型,仅有8个比特位可存储,会出现高位被阶段的情况: * 01000000 * 因此这就是我们看到的最终结果是"64" * */ b = (byte)(a + b); System.out.println(b); //定义一个字符类型 char c = 'a'; //当我们用一个字符类型和一个整形相加时也会出现自动类型转换,即将char类型转换成int类型,而变量c对应的ASCII编码表的数字位"97",将其和整形'3'进行相加最终得int类型"100". System.out.println(c + 3); //定义一个字符串类型,需要使用双引号 String d = "a"; //任何数据类型和字符串相加都会被字符串"同化",也就是最终结果依旧是字符串,我们将字符串"a"和int类型"3"相加,最终会被字符串"a"所同化,得到结果就是我们看到的"a3" System.out.println(d + 3); //定义一个布尔类型 boolean e = true; //布尔类型和字符串相加也会被同化 System.out.println(e + "100"); // System.out.println(e + 100); //注意,布尔类型不能和int类型做运算 // System.out.println(e + 'a'); //注意,布尔类型也不能和字符类型做运算 } }
三.分析下面代码那句会编译失败
/** * 数据类型转换 * @author 尹正杰 * */ public class Dome1 { public static void main(String[] args) { //定义a,b,c三个变量均为byte类型,且为a,b做了初始化赋值 byte a = 20,b=80,c; //在编译时,JVM就知道20+80的值是100,又知道c的类型是byte; //而且100在byte的表示范围内,因此该语句在编译时不会出错。 c = 20 + 80; System.out.println(c); //在编译时,JVM并不知道a和b的值,所以编译失败.如果向编译正确可以写"c = (byte)(a + b);" c = a + b; System.out.println(c); } }