操作符接受一个或者多个参数,并生成一个新值。
操作符用于操作数,生成一个新值。 另外有些操作符可能会改变操作数自身的值,这被称为“副作用”。
这些能改变操作数的操作符最普遍的作用就是产生副作用。
几乎所有的操作符都只能操作“基本类型”。 例外的操作符是 = == 和 != 。
这些操作符能操作所有的对象。 除此之外,String类支持 + 和 +=.
优先级
当一个表达式中存在多个操作符时,操作符的优先级决定了各个部分的计算顺序。 最简单的规则就是先乘除后加减。另外也要明确括号的作用。
赋值赋值使用操作符 “=” 。
它的意思是 取右边的值 ,把它赋值给左边。
右边可以是任意数、变量或者表达式(只要能生成一个值就行),左边必须是一个明确的已命名的变量。 也就是说,必须有一个物理空间可以存储等号右边的值。
比如 :
a = 4 ;
但是不能把任何东西赋值给一个常数,常数不能作为左值。比如(4 = a ; worong !)
对于基本数据类型的赋值:
基本类型存储了实际的数值,而并非指向一个对象的引用,所以在为其赋值的时候,是直接将一个地方的内容复制到了另一个地方。 另外,对基本数据类型使用 a = b ,那么b的内容就复制给a,若紧接着修改a,b的值不受这种修改的影响
但是在为对象赋值的时候,情况却发生了变化:
对一个对象进行操作时,我们真正操作的是对象的引用。 所以倘若“将一个对象赋值给另外一个对象”,实际上是将“引用”从一个地方复制到另外一个地方。 这意味着假若对对象使用c = d ,那么c和d都指向原来只有d指向的那个对象。
Tank类有两个实例 t1和t2, 分别对level域赋不同的值,然后将t2赋给t1,紧接着又修改t1.
由于赋值操作的是一个对象的引用,所有修改t1的同时,也改变了t2. 这是由于t1和t2包含的是相同的引用,他们指向相同的对象(原来t1包含的对对象的引用,是指向一个值为9的对象,在对t1赋值的时候,这个引用被覆盖了,也就是丢失了;而那个不再被引用的对象会有垃圾回收器自动清理)。
这种特使的现象被称为“别名现象”,是java操作对象的一种基本方式,如何避免的?可以这样写
t1.level = t2.level ;
这样便可以保持两个对象彼此独立,而不是将t1和t2绑定到相同的对象上。
算数操作符+ - * / 加减乘除 以及取模操作符 %。
要将x+4,并将结果赋值给x ,可以写成 x +=4 ;
通过Random类的对象,程序可以生成许多不同类型的随机数字,只需要调用
传递给netxtInt()的参数设置了所产生随机数的上线,而其下限为0 。 但是这个下限并不是我们所想要的,可以对结果进行+1操作。
自动递增和递减
++ –
举个例子 假设 a是一个int值,++a 就能等价于 a = a +1 ;
递增和递减操作符不仅改变了变量,并且以变量值作为生成的结果。
这两个操作符各有两种使用方式,通常称为前缀式和后缀式。
前缀递增: 表示 ++操作符位于变量或者表达式的前面,反之 后缀递增 ++操作符位于变量或者表达式的后面。
类似的,前缀递增递减 一样的..
**对于前缀形式:执行完运算后才得到值。
对于后缀形式:在运算之前就得到值**。
他们是除了那些设计赋值的操作符以外,唯一就有“副作用”的操作符。 也就是说,他们会改变操作数,而不仅仅是使用自己的值。
int i = 1; System.out.println("i:" + i); // 1 System.out.println("======================="); System.out.println("++i:" + ++i); // 2 先执行运算 i首先加1,此时i为2,并以变量(即i=2)的值作为结果 System.out.println("i:" + i); // 2 System.out.println("i++:" + i++); // 2 先给变量i赋值(i=2)因为是以变量的的值作为结果,所以 i++ 的值为2,在执行运算,运算后 i+1变为3 System.out.println("i:" + i); // 3 System.out.println("======================="); System.out.println("--i:" + --i); // 2 先运算,运算后3-1后 i为2 ,再赋值,此时i 为2 System.out.println("i:" + i); // 2 System.out.println("i--:" + i--); // 2 System.out.println("i:" + i); // 1关系操作符
关系操作符生成的是一个boolean结果。
真实则为true,反之false。
主要包括一下符号:
< 、 > 、
测试对象的等价性
尽管对象的内容相同,但是对象的引用确实不同的,而 ==和 != 比较的是对象的引用。
如果相比较两个对象的实际内容是否相同,需要使用 equals().
假设我们创建了自己的类,就像下面那样
what the fuck ? 又是false了…..
这是因为 equals()的默认行为是比较引用, 所以除非在自己的新类中覆盖equals方法,否则不可能表现出我们希望的行为。
大多是java库都实现了equals方法,以便用来比较对象的内容,而非对象的引用。
逻辑操作符
与 && 或 || 非 ! ,返回一个布尔值。
直接常量直接常量后面的后缀字符标识了它的类型。
若为 大写或者小写的L,代表long
F ,代表float
D,代表都变了
十六进制适用于所有整数数据类型,以前缀 0x或者0X,后面跟随0~9或者大写(或小写)的a~f来表示。
八进制数由前缀0以及后续的0~7的数字来表示。
按位操作符用来操作二进制
&= 按位与赋值
|= 按位或赋值
^= 按位非赋值
也是用来操作二进制
三目表达式= 右移赋值
= 无符号右移赋值
<<= 赋值左移
boolean-exp ? value0 : value1
boolean-exp 为true,则计算 value0 ,反之计算 value1 .
字符串操作符 + 和 +=
这个操作符在java中有一项特殊的用途: 连接不同的字符串