Java的8大基本数据类型
Java8大基本数据类型
byte(字节型)、short(短整型)、int (整型) 、long(长整型)
float(单精度浮点型)、double(双精度浮点型)、boolean(布尔型)、char(字符型)
整型
byte数据类型是8位, 1个字节,默认值:0,取值范围:(-128 - 127);
short数据类型是16位,两个字节,默认值:0,取值范围:(-2^15 - 2^15 -1);
int 数据类型是32位,4个字节,默认值:0,取值范围:(-2^31 - 2^31 -1)
long数据类型是64位,八个字节,默认值:0L,整型常量若要声明为long类型,需要在数字后加上l或L,long a = 10000L;
浮点型
float数据类型是单精度、32位浮点数;默认值:0.0f,若要定义float类型的变量需要在小数后面追加f或者F,float a= 2.3f;
double数据类型是双精度、64位、符合IEEE 754标准的浮点数;默认值:0.0d,double d = 2.3;
描述整数默认用int,描述小数默认用double。long一般用于描述日期、时间、内存、文件大小,IO处理一般使用byte
字符型
char一般用于描述中文(基本忽略),取值范围:(\u0000 - \uffff) —>(0 - 65535);,字符型用’ '表示;char ch = ‘A’,
char和int可以相互转换,char转int直接赋值,int 转char强转。
布尔型
boolean表示一位的信息,只有两个取值:true和false,默认值:false
每个数据类型对应的包装类中都有对应的SIZE属性返回位数,MIN_VALUE和MAX_VALUE返回该数据类型最小值和最大值。
public class PrimitiveTypeTest{ public static void main(String[] args){ //byte System.out.println("基本类型:byte 二进制位数:" + Byte.SIZE); System.out.println("包装类:java.lang.Byte"); System.out.println("最小值:Byte.MIN_VALUE = " + Byte.MIN_VALUE); System.out.println("最大值: Byte.MAX_VALUE = " + Byte.MAX_VALUE); // char System.out.println("基本类型:char 二进制位数:" + Character.SIZE); System.out.println("包装类:java.lang.Character"); // 以数值形式而不是字符形式将Character.MIN_VALUE输出到控制台 System.out.println("最小值:Character.MIN_VALUE=" +(int)Character.MIN_VALUE); // 以数值形式而不是字符形式将Character.MAX_VALUE输出到控制台 System.out.println("最大值:Character.MAX_VALUE="+(int) Character.MAX_VALUE); } }
运行结果:
基本类型:byte 二进制位数:8 包装类:java.lang.Byte 最小值:Byte.MIN_VALUE = -128 最大值: Byte.MAX_VALUE = 127 基本类型:char 二进制位数:16 包装类:java.lang.Character 最小值:Character.MIN_VALUE=0 最大值:Character.MAX_VALUE=65535
Float和Double的最小值和最大值都是以科学计数法的形式输出的,结尾的“E + 数字"表示E之前的数字要乘以10的多少次方。
eg:1.4E-45 —> 1.4 ✖ 10^(-45)
数据类型转换必须满足如下规则:
1.不能对boolean类型进行类型转换
2.不能把对象类型转换成不相关类的对象
3.小的数据类型与大的数据类型做数值运算时,小的数据类型会自动提升为大的数据类型。
4.大的数据类型要转为小的数据类型必须强转,强转可能会丢失数据。
5.浮点数到整数的转换是通过舍弃小数得到,而不是四舍五入
低级--------> 高级
byte,short,char->int->long->float->double
举例说明:
public class Test{ public static void main(String[] args){ int maxValue = Integer.MAX_VALUE; int minValue = Integer.MIN_VALUE; System.out.println("maxValue + 1 = " + (maxValue + 1)); System.out.println("minValue - 1 = " + (minValue - 1)); } }
运行结果:
maxValue + 1 = -2147483648 minValue - 1 = 2147483647
上述结果说明int型存在数据溢出问题,解决方案只有一个:更换数据类型,使用long来解决数据溢出问题:
long max = maxValue + 1L; long min = minValue - 1L;
运行结果:
maxValue + 1 = 2147483648 minValue - 1 = -2147483649
因为程序执行顺序是从右边到左边,所以这里在定义long类型变量时要给运算数字后面加L,不然运算结果还是int型发生溢出。
大的数据类型转为小的数据类型,必须强转,但有时会丢失内容
long num = 2147483648L; int result = (int) num; System.out.println(result);
运行结果:-2147483648
关于数据默认值,默认值在主方法中无效
public class Test{ public static void main(String[] args){ int num ;//定义一个整型变量但并未初始化 System.out.println(num); } }
运行结果:
错误: 可能尚未初始化变量num System.out.println(num); ^ 1 个错误
这个时候有两种解决方案,一种是在使用前进行赋值,另一种是在定义变量时赋值。
class InitTest{ public int a; } public class Test{ public static void main(String[] args){ InitTest test = new InitTest(); System.out.println(test.a); } }
byte与int之间的转换
整型常量值如果在byte类型的保护范围之内,可以直接赋值给byte变量,无须强转;
整型常量值如果超出byte范围必须强转,以及整型变量无论值是否在byte范围中都需要强转。
//10在byte范围内,强转与不强转结果一样。 byte data = 10; System.out.println(data); 输出结果:10 //int变量赋值给byte类型,必须强转 byte data = (byte)300; 输出结果:44 解析:300的二进制为1 0010 1100,经过强转后的data只有8位, 所以data = 0010 1100 = 44
char与int之间的转换
//char直接转为int char c= 'A'; int num = c + 32; System.out.println(num); //int需要强转到char char x = (char) num; System.out.println(x); 输出结果:97 和 a
补充:ASCII码中65~90为26个大写英文字母,97~122号为26个小写英文字母
注意:字符型数字(‘0’ - ‘9’)与int数字(0 - 9) 不同,if('0' == 0)一定是false