数据类型和运算符
摘要:本文主要介绍数据类型和运算符。
数据类型
常量的定义
一块内存中的数据存储空间,里面的数据不可以更改。
变量的定义
一块内存中的数据存储空间,因为里面的数据可以更改,所以称为变量。
变量的分类
局部变量:方法或语句块内部定义的变量,作用域是当前方法或当前语句块,需要在初始化时赋值,存在占内存中。
成员变量:方法外部或类的内部定义的变量,作用域是整个类,有默认值,存在堆内存中。
数据类型的定义
java语言是一种强类型语言。通俗点说,在java中存储的数据都是有类型的,而且必须在编译时就确定其类型。
数据类型的分类
基本类型变量:保存原始值,它代表的值就是数值本身。通过值传递进行赋值。
引用类型变量:保存引用值,指向内存空间的地址,代表了某个对象的引用,对象本身存放在这个引用值所表示的地址的位置。通过引用传递进行赋值。
基本数据类型
boolean:
boolean数据类型表示1位的信息,只有true和false两个取值,这种类型只作为一种标志来记录true/false情况。
默认值是false。
char:
char类型是一个单一的16位unicode字符,单引号括起来的单个字符表达,通常用16进制表示。
最小值是’\u0000’(即为0),最大值是’\uffff’(即为65,535)。可以当整数来用,它的每一个字符都对应一个数字。
字符常量指用单引号括起来的单个字符,如'a','a',请特别注意,字符的定界符是单引号,而非双引号。
除了以上所述形式的字符常量值之外,java还允许使用一种特殊形式的字符常量值,这通常用于表示难以用一般字符来表示的字符,这种特殊形式的字符是以一个“\”开头的字符序列,称为转义字符。
java中的常用转义字符见下图:
byte:
byte数据类型是8位的有符号的以二进制补码表示的整数,占1字节。
最小值是-128(-2^7),最大值是127(2^7-1),默认值是0。
short:
short数据类型是16位的有符号的以二进制补码表示的整数,占2字节。
最小值是-32768(-2^15),最大值是32767(2^15-1),默认值是0。
int:
int数据类型是32位的有符号的以二进制补码表示的整数,占3字节。
最小值是-2,147,483,648(-2^31),最大值是2,147,485,647(2^31-1),默认值是0。
long:
long数据类型是64位的有符号的以二进制补码表示的整数,占4字节。
最小值是-9,223,372,036,854,775,808(-2^63),最大值是9,223,372,036,854,775,807(2^63-1),默认值是0l。
float:
float数据类型是32位的单精度的符合ieee 754标准的浮点数,占4字节。
默认值是0.0f。
double:
double数据类型是64位的双精度的符合ieee 754标准的浮点数,占8字节。
默认值是0.0d,浮点数的默认类型为double类型。
数据类型转换
字符型、整形、浮点型的数据在混合运算中相互转换,遵循以下规则:
◆ boolean类型不可以转换为其他的数据类型。
◆ 容量小的类型自动转换为容量大的类型,顺序为:
byte/short/char→int→long→float→double
byte/short/char之间不会相互转换,他们在计算时会首先转为int类型。
◆ 容量大的数据类型转为容量小的数据类型时,要加上强制转换符,但可能造成精度降低或溢出。
◆ 有多种类型的数据类型混合运算时,首先自动将所有的数据转换成容量最大的数据类型,然后在进行计算。
运算符
java语言支持如下运算符:
◆ 算术运算符:++,--,+,-,*,/,%。
◆ 赋值运算符:=,+=,-=,*=,/=,%=。
◆ 关系运算符:>,<,>=,<=,==,!=。
◆ 逻辑运算符:&,|,!,^,&&,||。
◆ 条件运算符:? :。
◆ 位运算符:&,|,~,^,>>,<<,>>>。
优先级如下图所示:
算术运算符
算术运算符主要用于进行基本的算术运算,如加法、减法、乘法、除法等。
单目运算符:+(取正),-(取负),++(自增),--(自减)。
双目运算符:+(相加),-(相减),*(相乘),/(相除),%(取余或者取模)。
关于++和--:
只能用来操作变量,不能用来操作数值或者常量。
自增(++)或自减(--)在变量后面,会先赋值,然后再计算:
1 public static void main(string [] args) { 2 int a = 0; 3 int b = a++; 4 system.out.println("a = " + a); 5 system.out.println("b = " + b); 6 }
结果为:
1 a = 1 2 b = 0
自增(++)或自减(--)在变量前面,会先计算,然后再赋值:
1 public static void main(string [] args) { 2 int a = 0; 3 int b = ++a; 4 system.out.println("a = " + a); 5 system.out.println("b = " + b); 6 }
结果为:
1 a = 1 2 b = 1
赋值运算符
赋值运算符是指为变量或常量指定数值的符号,如可以使用“=”将右边的表达式结果赋给左边的操作数。
主要有:=,+=,-=,*=,/=,%=。
其中,
a += b; 等价于 a = a + b; ,
a -= b; 等价于 a = a - b; ,
a *= b; 等价于 a = a * b; ,
a /= b; 等价于 a = a / b; ,
a %= b; 等价于 a = a % b; 。
关系运算符
比较运算符用于判断两个数据的大小,如大于、等于、不等于,比较的结果是一个布尔值。
注意不要对浮点数进行相等性运算,比如 1.0 - 0.3 == 0.7 。
注意:
>、<、>=、<=只支持左右两边操作数是数值类型。
==、!=两边的操作数既可以是数值类型,也可以是引用类型。
比较equals和==的区别:
值类型的变量存储在内存中的堆栈(简称栈),引用类型的变量在栈中仅仅是存储变量的地址,而其本身则存储在堆中。
==操作比较的是两个变量的值是否相等,对于引用型表示的是变量存储的地址是否相同,即栈中的内容是否相同。
equals操作判断是否为一个对象的引用,即堆中的内容是否相同。
==比较的是地址,而equals比较的是内容,显然,当equals为true时,==不一定为true。
逻辑运算符
逻辑运算符主要用于进行逻辑运算。
与(&):只有当两边都为真,结果才为真,如果有一边为假,结果为假。
或(|):如果有一边为真,结果为真,只有当两边都为假,结果才为假。
非(!):当右边为假,结果为真,当右边为真,结果为假。
异或(^):当两边真假不一致即一边为真一边为假,结果才为真,两边同为真或两边同为假,结果均为假。
短路与(&&):当左边为假,则不再判断右边,直接得出结果为假。
短路或(||):当左边为真,则不再判断右边,直接得出结果为真。
条件运算符
条件运算符(? :)也称为“三元运算符”。
语法形式:布尔表达式 ? 表达式1 : 表达式2;
运算过程:如果布尔表达式的值为真,则返回表达式1的值,如果布尔表达式的值为假,则返回表达式2的值。
位运算符
主要有位与(&),位或(|),位非(~),位异或(^),右移(>>),左移(<<),0符号位填充的右移(>>>)。
位运算是以二进制位为单位进行的运算,其操作数和运算结果都是整型值。
位运算与逻辑运算的相应操作的真值表完全相同,其差别只是位运算操作的操作数和运算结果都是二进制整数,而逻辑运算相应操作的操作数和运算结果都是逻辑值布尔型。
右移(>>)是将一个二进制数按指定移动的位数向右移位,移掉的被丢弃,左边移进的部分或者补0(当该数为正时),或者补1(当该数为负时)。
左移(<<)是将一个二进制数按指定移动的位数向左移位,移掉的被丢弃,右边移进的部分或者补0(当该数为正时),或者补1(当该数为负时)。
将一个数左移会使该值乘以2的幂。
将一个数右移会使该值除以2的幂。
无符号右移(>>>)永远不会产生负号,因为其符号位总是被补零。不论被移动数是正数还是负数,左边移进的部分一律补0。