一、赋值运算符:=
它的意思是“取右值,把它复制给左值”。右值可以是任何常数、变量或表达式(只要它能生成一个值就行)。但左值必须是一个明确的、已命名的变量,即必须有一个物理空间可以存储等号右边的值。
如下:
int a;
a = 4; // 可以将常量赋给变量
//以下是错误
4 = a; // 不能把任何东西赋给一个常数
1、对于基本数据类型,赋值运算符是很简单的,基本类型存储了实际的值,所以对其赋值的时候,是直接将一个地方的内容复制到了另一个地方。
例如:
int a; int b = 4; a = b;
那么b的内容4就复制给了a。若是修改a,b并不受影响。2、对于引用数据类型,对一个对象进行操作时,我们真正操作的是对对象的引用。所以,若是“将一个对象赋值给另一个对象”,实际是将“引用”从一个地方复制到另一个地方。
假如对对象使用c = d,那么c和d都指向原本只有d指向的那个对象。
如下:
class Num {
int num;
Num(int num){
this.num = num;
}
}
public class Assignment {
public static void main(String[] args) {
Num a = new Num(1);
Num b = new Num(2);
System.out.println("a.num = " + a.num + "\t" + "b.num = " + b.num);
a = b; // a和b都指向原来b指向的对象
System.out.println("a.num = " + a.num + "\t" + "b.num = " + b.num);
a.num = 3; // 因为此时a与b是指向同一对象,所以此时改变a所指向对象的值,b所指向的结果也改变
System.out.println("a.num = " + a.num + "\t" + "b.num = " + b.num);
}
}
【结果】
注:在许多编程语言中,我们可能会期望a,b是相互独立的,但由于赋值运算符操作的是一个对象的引用,所以修改a的同时也改变了b!
这是因为a和b包含的是相同的引用,它们指向相同的对象。(原本a包含的对对象的引用,是指向一个值为1的对象,但在对a赋值时,这个引用被覆盖了,也即丢失了;而那个不再被引用的值为1的对象会由“垃圾回收器”自动清理。)这种特殊的现象通常称作“别名现象”,是Java操作对象的一种基本方式。
而若要避免别名问题,则应该如下:
a.num = b.num;
这样就可以保持两个对象彼此独立,而不是将a和b绑定到相同的对象。
【注意事项】
(1)在Java中,可以通过一条赋值语句对多个变量进行赋值:
int a, b, c;
a = b = c = 5; // 正确,为三个变量同时赋值
// 下面是错误
int a = b = c = 5; // 错误
(2)在为变量赋值时,当两种变量类型彼此不兼容时,或目标类型取值范围小于源类型时,需要进行强制类型转换。
(4)在使用+=、-=、*=、/=、%=运算符进行赋值时,强制类型转换会自动完成,不需要做任何电焊工的声明。
二、算术运算符:+,-,*,/,%
(1)整数除法会直接去掉结果的小数位,而不是四舍五入。因为整形变量无法保存小数点后面的数据。
(2)Java中取余运算符%的操作数可以是负数和浮点数。而在C/C++中,取余运算符只能是整数。
(3)在进行取模运算时,运算结果 的正负取总发不过去被模数(%左边的数)的符号,与模数(%右边的数)的符号无关。
【示例】
public class Unary {
public static void main(String[] args) {
int x = 10/3; // 取值为3,而不是3.33333...
System.out.println("x = " + x);
int a = 10%-3;
System.out.println("a = " + a);
float b = 5.2f % 3.1f;
System.out.println("b = " + b);
}
}
【结果】
三、关系运算符:>,<,<=,>=,==,!=
(1)关系运算符生成的是一个boolean结果,它们计算的是操作数的值之间的关系。
(2)等于(==)和不等于(!=)适用于所有的基本数据类型,也适用于所有的对象。注意:对于基本数据类型,它们比较的是值(基本数据类型中存储的值)“本身”;对于引用数据类型,它们比较的变量对对象的引用(其所指向的对象在内存中的地址)。
(3)>、<、<=、<=比较符不适用于布尔类型,因为布尔类型只有true和false,大小没有意义。
四、逻辑运算符
普通与(&)、普通或(|)、短路与(&&)、短路或(||)、非(!)
与、或、非操作只能运用于布尔值,并返回一个布尔值。
【分享一道Java面试题】: &和&&、|和||的关系是怎么样?
运算符"&“和”&&“都表示与操作:当且仅当运算符两边的操作数都为true时,其结果才为true,否则结果为false。
(1)与(&):不论左边为true或false,右边的表达式都会进行运算。
(2)短路与(&&):当左边为false时,右边的表达式不会进行计算。
运算符”|“和”||"都表示或操作:当运算符两边的操作数任何一边的值为true时,其结果才为true,当两边的值都为false时,结果才为false。
(1)或(|):不论左边为true或false,右边的表达式都会进行运算。
(2)短路或(||):当左边为true时,右边的表达式不会进行计算。
// 其中表达式1和表达式2必须的结果必须是布尔值,
(表达式1)&(表达式2) // 普通与,表达式1与表达式2都要判断。
(表达式1)|(表达式2) // 普通或,表达式1与表达式2都要判断。
(表达式1)&&(表达式2) // 短路与,若表达式1为false,则表达式2不会判断。整体结果为false
(表达式1)||(表达式2) // 短路或,若表达式1为true,则表达式2不会判断。整体结果为true
!(表达式)
五、位运算符
其中,除 ~ 运算符外,其他位运算符都可以与=联合使用。&=、|=、^=、>>=、<<=、>>>=
六、运算符优先级