java操作符
1 使用java操作符
几乎所有的操作符都只能操作“基本类型”,
例外的是"="、"=="、"!="可以操作几乎所有的对象
此外String还支持“+”和“+=”
2 优先级
最简单的规则就是先乘除后加减,实际code时,最好用括号,简单明了
3 赋值操作符 “=”
必须有一个物理空间可以存储等号左边的值
1.对于基本类型,就是将一个地方的内容赋值到另外一个地方
2.为对象“赋值”时,我们真正操作的是对对象的引用,就是将右边的引用赋值给左边
4 算术运算符
java的基本算术操作符与其他大多数语言类似,包括 + , − , +,-, +,−,% , ∗ , / , ,*,/, ,∗,/,
java也支持操作符后紧跟一个符号,包括 + = , − = , ∗ = , / = , +=,-=,*=,/=, +=,−=,∗=,/=,%=
4.1 一元加、减操作符
一元减号用于转变数据的符号,而一元加号只是为了与一元减号相对应
例:a = -b
注意像 x = a * -b 编译器是可以识别的,即 x = a * (-b)
5 自动递增或递减
前缀加、前缀减、后追加、后缀减
前缀意味着先执行加减运算再生成值
后缀意味着先生成值后进行加减运算
C
+
+
C++
C++就是“对c的超越”
"Java =
C
+
+
−
−
C++--
C++−−"
6 关系操作符
关系操作符生成的是一个boolean结果,计算的是操作数之间的关系
包括 > , > = , < , < = , = = , ! = >,>=,<,<=,==,!= >,>=,<,<=,==,!=
= = == ==和 ! = != !=适用于所有基本数据类型和对象
6.1 测试对象的等价性
=
=
==
==和
!
=
!=
!=比较的是对象的引用
equals()比较的是对象实际的内容
public class Test{
public static void main(String[] args) {
Integer a = new Integer(54);
Integer b = new Integer(54);
//比的是引用
System.out.println(a == b);
System.out.println(a != b);
//比的是内容
System.out.println(a.equals(b));
}
}
/*output
false
true
true*/
这里又列举了一个例子,我们自己定义了一个新类,但我们发现结果很奇怪,
因为equals()的默认行为是比较引用,所以除非在新类中覆盖equals()方法
大多数Java类库都实现了我们期望的equals()方法
public class Test{
public static void main(String[] args) {
Demo d1 = new Demo(54);
Demo d2 = new Demo(54);
System.out.println(d1.equals(d2));
}
}
class Demo{
int value;
public Demo(int value){
this.value = value;
}
}
7 逻辑操作符
与(&&)、或(||)、非(!)
与C++不同的是,不可将一个非布尔值的值当作布尔值在逻辑表达式中使用
while(1)//这样的写法在Java中会报错 不兼容的类型: int无法转换为boolean
7.1 短路
即一旦明确无误地确定整个表达式的值,就不再计算表达式的余下部分。
public class Test{
public static void main(String[] args) {
int x = 0;
int y = 0;
int k = 0;
for(int z = 0;z < 5;z++){
if((++x > 2) && (++y > 2) && (k++ > 2)){
x++;
++y;
k++;
}
}
System.out.println(x + " " + y + " " + k);
}
}
/*output
5 3 1
*/
8 直接常量
直接常量后面的后缀字符标志它的类型,
大写或小写的L/l,代表long (但小写的l易产生混淆)
大写或小写的F/f,代表float
大写或小写的D/d,代表Double
十六进制以前缀0x或0X
八进制以前缀0
二进制没有直接常量表示方法,可以通过Integer和Long的静态方法toBinaryString()实现
如果将比较小的类型传递给Integer的toBinaryString()方法,则该类型将自动被转换成int
8.1 指数计数法
float a = 1.39e-43f
即 1.39 ∗ 1 0 − 43 1.39*10^{-43} 1.39∗10−43
9 按位操作符
&(与) |(或) ~(非) ^(异或)
按位操作符可与等号联合使用 :&=, |=, ^= 没有~=
对于布尔值,按位操作符与逻辑操作符效果相同,但按位操作符不会中途短路
10 移位操作符
左移( << ) 右移( >> )
"有符号"右移使用“符号扩展”,若符号为正,则在高位插入0;若符号为负,则在高位插入1
Java增加了一种无符号右移位操作符( >>> ),无论正负,都在高位插入0
移位操作符也可与等号联合使用
对char、byte、short类型的数值进行移位处理,
在移位之前,它们会被转为int类型,并且得到结果也是int类型的值
10.1 原名、补码、反码
(1)原码:
最简单的机器数表示法。用最高位表示符号位,‘1’表示负号,‘0’表示正号。其他位存放该数的二进制的绝对值。
(2)反码:
正数的反码还是等于原码
负数的反码就是他的原码除符号位外,按位取反。
(3)补码
正数的补码等于他的原码
负数的补码等于反码+1。
11 三元操作符if-else
booolean-exp ? value0 : value1 表达式为true返回value0,反之返回value1
12 字符串操作符 + 和 +=
连接不同的字符串
int x = 1;
System.out.println(x + "xyz");//第一个x自动转化为字符串
System.out.println(“” + x);//相当于Integer.toString(x)
13 类型转换操作符
类型转换 “()”
扩展转换(小类型->大类型)不用显示使用操作符
窄化转换(大类型->小类型)需要显示转换
13.1 截尾和舍入
窄化转换 例如4.7变成int就是4,直接截去尾巴,调用Math.round()会四舍五入
13.2 提升
如果对基本数据类型进行算术运算或按位运算,大家都自动提升为其中最大的数据类型