JAVA数据类型的四类八种
先说一下变量声明的格式:类型 标识符 赋值符号 常量值(eg:int a = 3)
注意:
java语言中局部变量未赋初值之前不允许使用(局部变量是在方法块里的,方法块是在内存方法区里的,方法区的内存是跟着方法一起开辟的,如果不赋初值则它不会占内存,所以不能用)如果局部变量未赋初值使用,则编辑时会报错,但全局(成员)变量未赋值之前可以使用,默认为0
局部变量必须在声明后使用,而成员变量可声明在任何位置
一、整型
- byte ,占一个字节,取值范围是:-128~127
- short,占两个字节,取值范围是:-32768~32767
- int,占四个字节,取值范围是:-231 ~231 -1
- long,占八个字节,取值范围是:-263~263 -1
举几个栗子:
byte b = ‘c’; //正确,ASCII表中一个字符代表一个数字,这就相当于放的是c在ASCII中对应的数字,这样的写法只对byte类型生效,其他类型就不行。
为什么long型数字后面要加个L?(long a = 123L;)
注意:所有的数字赋值之前默认是int型。
short a= 123; //short占两字节,它的最大值不会超过int的最大值。
short b = 35536 //但如果此处赋的值大于short的最大值,会报错(这个报错是在将35536放入b时报错)。(往int里可以放下,但往short里放不下)
long c1 = 6; //此时不会报错,因为6未超过int的最大值,肯定也不会超过long的最值
long c2 = 6666666666666; //这里赋的值显然已经超过了int的最大值,所以它在未赋值之前就已经报错了。(往int里放已经就放不下了)
long c3 = 6666666666666L; //此时就正确了。
①long d1 = 1;② long d2 = 1L; ②比①编译的快,因为②直接把1放到了long型里,而①还要转换一次。
b++、b += 1、b = b+1的区别:
++、+=不会改变变量本身的数据类型
byte b = 127;
b = b+1; //编译不通过超出范围,会有损失
byte b = 127;
b++;/b+=1; //编译能通过,结果b未=为-128
底层解释:
-
b = b+1;
此时b+1变为了int型,再把int型的b赋回给btye型是不可能的 -
b++/b += 1;
在此内存上+1,内存不变,为1000 0000为-128
注意:
=+是赋值号;+=/++是一个运算符,不换内存,在原内存上自增,溢出,符号位变为1。
二、浮点型
- float(占四个字节)
- double(占八个字节)
- float a = 4.3f; 因为这里默认把赋的值当成double型,所以要加F/f
(但float a = 4; 不会报错)
注意:
System.out.println(3/0);//报错
System.out.println(3.0/0.0);//输出:Infinity 表示无限的,因为这里的0.0并不表示0,而可能是0.000000000001
三、字符型
char(占两个字节):具体占用的字节数跟编码方式有关,Unicode占4个字节,utf-8占3个字节。
char a1 = 'a'; //任意一个字符需要加单引号
char a2 = '我';
char a3 = 111; //整数 范围是0~65535,十进制、八进制、十六进制都可以。输出为字符编码表中对应的字符
char c = 'a'+'b'; //char类型相加,转为int型,输出字符编码表中对应的字符
char c = 'a' + 1; //转为int型,输出b(98)
char m = '中'+'国'; //输出42282
int a = '中'+'国'+'国'+'国'; //输出86820
char s = '中'+"国" //报错,String型不能转换为char型
四、布尔型
boolean(占4个字节(变字节量)):java使用c语言写的,c语言里没有boolean型,用大于0或者小于0来表示真假,所以是int型,占4个字节。但在做Boolean类型的数组时会做数据压缩,所以boolean型数组的false或frue占1字节。