Java之路:运算符

一、赋值运算符:=

它的意思是“取右值,把它复制给左值”。右值可以是任何常数、变量或表达式(只要它能生成一个值就行)。但左值必须是一个明确的、已命名的变量,即必须有一个物理空间可以存储等号右边的值。

如下:

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
!(表达式)

五、位运算符

在这里插入图片描述
在这里插入图片描述

其中,除 ~ 运算符外,其他位运算符都可以与=联合使用。&=、|=、^=、>>=、<<=、>>>=

六、运算符优先级

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值