史上最全讲解:JAVA中的基本数据类型及其转换
计算机编程语言是处理数据的,处理的数据必须要有明确的类型。Java中的数据类型主要分为基本数据类型和引用数据类型,不同的数据类型相互之间可以转化(基本数据类型中布尔类型除外)。
1.数据类型简介
1.1基本数据类型
JAVA中的基本数据类型主要包括四类八种。表示如下:
数据类型 | 表示方法 | 字节数 | 比特位 | 范围 |
---|---|---|---|---|
字节型 | byte | 1 | 8 | -2^7 ~ 2^7-1,-128~127 |
短整型 | short | 2 | 16 | 2^15 ~ 2^15 -1,约-3万~3万 |
整型 | int | 4 | 32 | 2^31 ~ 2^31 -1,约-21亿~21亿 |
长整型 | long | 8 | 64 | 2^63 ~ 2^63-1,很大! |
单精度型 | float | 4 | 32 | 有效位数7位,很大! |
双精度型 | double | 8 | 64 | 有效位数15位,很大很大!!! |
字符型 | char | 2 | 16 | 0~2^16,约0 ~ 6万 |
布尔型 | boolean | 1 | true,false |
注意事项:
-
整型默认的是int类型,浮点型默认的是double类型,字符型默认为’’,布尔型默认为false;
-
byte、short和char只要数值范围不超过各自的范围,即可以通过赋值语句赋值。
public class Test{ public static void main(String[] args){ byte b = 1;//1为int类型并且没有超出byte类型的范围可以转化(赋值) short s = 2;//2为int类型并且没有超出short类型的范围(赋值) System.out.println(b); System.out.println(s); } }
-
定义一个长整型时,当数字范围超过了int类型的范围时(-21亿~21亿),要在数字末尾加上L,定义一个单精度类型时要在末尾加上F。
public class Test{ public static void main(String[] args){ long L = 10000000000;//100亿默认是int类型,超出了int的范围(-21亿~21亿)不能自动转成 long长整型 float f = 3.14;//3.14默认是双精度double类型,不能自动转成单精度float类型 System.out.println(L); System.out.println(f); } }
改正后的代码如下:
public class Test{
public static void main(String[] args){
long L = 10000000000L;//100亿默认是int类型,超出了int的范围(-21亿~21亿)不能自动转成long长整型
float f = 3.14F;//3.14默认是双精度double类型,不能自动转成单精度float类型
System.out.println(L);
System.out.println(f);
}
}
1.2引用数据类型
应用数据类型主要包括以下三种:类、接口、数组
2.数据类型转换
在JAVA编程中,遇到数据不可避免的会发生数据类型的转换。数据类型的转换主要包括以下两种:自动转换类型和强制转换类型。基本数据类型的范围从小到大表示如下:
byte < short < char < int < long < float < double
注意:布尔类型不参与数据类型转换
2.1 自动转换类型
-
从小到大会发生自动类型转换
public class Test{ public static void main(String[] args){ long L = 1000000000;//10亿默认是int类型,在int的范围(-21亿~21亿)可以自动转成long 长整型 System.out.println(L); } }
-
多个数据类型的数据参与计算,计算的结果数据类型会自动提升为最大类型
public class Test{ public static void main(String[] args){ byte b = 1; short s = 2; double d = 3.0; double result = b + s + d; System.out.println(result); } }
-
如果参与计算的数据中最大类型没有int大(为byte、short、char),那么计算结果会自动提升为int 类型
public class Test{ public static void main(String[] args){ byte b = 1; short s = 2; short result = b + s;//计算结果会自动提升为int类型,用short类型来接收会出错 System.out.println(result); } }
public class Test{
public static void main(String[] args){
byte b = 1;
short s = 2;
int result = b + s;//改为int类型来接收计算的结果不会出错
System.out.println(result);
}
}
-
特殊情况,给byte、short和char类型赋值的时候,只要int类型的数据在其数据范围之内即可发生自动转换。
(由于整型数据默认的是int类型,故赋值的时候看似发生了“大转小”自动转换的情况,由于java的底层是C,其实在存储 和计算的时候这些都是int类型)
public class Test{ public static void main(String[] args){ char c = 97;//int类型自动转换成char类型并在ascii码中查到到对应的字符赋给c System.out.println(c); } }
-
赋值的时候先检查类型是否允许,类型如果允许再检查是否存在变量。
public class Test{ public static void main(String[] args){ byte b = 12; char c = b;//char类型接收会报错 System.out.println(c); } }
public class Test{
public static void main(String[] args){
final byte b = 12;//将b定义为一个常量不会报错
char c = b;
System.out.println(c);
}
}
public class Test{
public static void main(String[] args){
byte b = 12;
short c = b;//改为short类型接收数据不会报错
System.out.println(c);
}
}
2.2 强制转换类型
数据类型从大到小, 需要强制数据类型转换,可能会损失精度,格式如下:
小变量数据类型 小变量名 = (小变量数据类型)大变量数值
-
范围内的强制数据类型转换,精度不会损失
public class Test{ public static void main(String[] args){ int a = (int) 100.1;//强制转换 System.out.println(a); } }
-
范围之外的数据类型转换,损失精度
public class Test{ public static void main(String[] args){ byte b = (byte)128;//128超出了byte的范围(-128~127) System.out.println(b); } }
成圆环形状从负数开始往回过对应位数
-
char类型的输出较为特殊
public class Test{ public static void main(String[] args){ char c = 'a' + 1; System.out.println(c);//c是char类型的计算得到int类型数值后会在 //ascii码表中查找对应的字符 System.out.println('a'+1);//计算得到的数值是int类型直接输出 } }