Java运算符:
所有运算符都能根据自己的运算对象生成一个值。除此以外,一个运算符可改变运算对象的值,这叫作“副作用”(Side Effect)。
运算符最常见的用途就是修改自己的运算对象,从而产生副作用。但要注意生成的值亦可由没有副作用的运算符生成。
几乎所有运算符都只能操作“主类型”(Primitives)。唯一的例外是“=”、“==”和“!=”,它们能操作所有对象(也是对象易令人混淆的一个地方)。除此以外,String 类支持“+”和“+=”。
优先级:
建议通过括号明确标记顺序
赋值:
赋值是用等号运算符(=)进行的。“取得右边的值,把它复制到左边”
右边的值可以是任何常数、变量或者表达式,只要能产生一个值就行。
左边的值必须是一个明确的、已命名的变量。也就是说必须有个物理空间保存右边的的值 。
主类型:主类型容纳了实际的值,而且并非指向一个对象的句柄。在为其赋值的时候,可将来自一个地方的内容复制到另一个地方。
假设为主类型使用“A=B”,那么 B 处的内容就复制到 A。若接着又修改了 A,那么 B 根本不会受这种修改的影响。
对象类型: 对一个对象进行操作时,我们真正操作的是它的句柄。所以倘若“从一个对象到另一个对象”赋值,实际就是将句柄从一个地方复制到另一个地方。
这意味着假若为对象使用“C=D”,那么 C 和 D 最终都会指向最初只有 D 才指向的那个对象。
在赋值过程中,那个句柄实际已经丢失;它的对象会由“垃圾收集器”自动清除)。这种特殊的现象通常也叫作“别名”,是 Java 操作对象的一种基本方式。
以对象为参数是传递句柄,也相当于别名。
算术运算符:
运算符与其它语言类似。整数除法会直接砍掉小数,而不是进位。简写运算如:+=
为生成数字,程序首先会创建一个 Random(随机)对象。由于自变量是在创建过程中传递的,所以 Java 将当前时间作为一个“种子值”,由随机数生成器利用。通过 Random 对象,程序可生成许多不同类型的随机数字。做法很简单,只需 调 用 不 同 的 方 法 即 可 : nextInt() , nextLong() , nextFloat() 或 者nextDouble()。
Random rand = new Random(); int j = rand.nextInt() % 100;
模数运算符(%)可将结果限制到运算对象减 1 的上限
1. 一元加、减运算符 一元减号得到的运算对象的负值。一元加号的含义与一元减号相反,虽然它实际并不做任何事情。
2.自动递增和递减 ++ --
对每种类型的运算符,都有两个版本可供选用;通常将其称为“前缀版”和“后缀版”。
对于前缀形式,我们在执行完运算后才得到值。但对于后缀形式,则是在运算执行之前就得到值。
它们是唯一具有“副作用”的运算符(除那些涉及赋值的以外)。
3.关系运算符 小于(<)、大于(>)、小于或等于(<=)、大于或等于(>=)、等于(==)以及不等于(!=)。
关系运算符生成的是一个“布尔”(Boolean)结果。
比较对象时使用equals()方法.主类型使用== !=
equals()的默认行为是比较句柄。除非在自己的新类中改变了 equals(),否则不可能表现出我们希望的行为。
大多数 Java 类库都实现了 equals(),所以它实际比较的是对象的内容,而非它们的句柄。
4.逻辑运算符 AND(&&)、OR(||)以及 NOT(!)
但要注意,对浮点数字的比较是非常严格的。即使一个数字仅在小数部分与另一个数字存在极微小的差异,仍然认为它们是“不相等”的。
短路:这意味着只有明确得出整个表达式真或假的结论,才会对表达式进行逻辑求值。因此,一个逻辑表达式的所有部分都有可能不进行求值
如果在前面部分可以得到结果,后面的的运算就不会执行。
5.按位运算 操作一个整数主数据类型中的单个“比特”,即二进制位。
若两个输入位都是 1,则按位 AND 运算符 (&)在输出位里生成一个 1;否则生成 0。若两个输入位里至少有一个是 1,则按位 OR 运算符 (|)在输出位里生成一个 1;只有在两个输入位都是 0 的情况下,它才会生成一个 0。若两个输入位的某一个是 1,但不全都是 1,那么按位 XOR(^,异或)在输出位里生成一个1。按位 NOT(~,也作“非”运算符)属于一元运算符;它只对一个自变量进行操作(其他所有运算符都是二元运算符)。按位 NOT 生成与输入位的相反的值——若输入 0,则输出 1;输入 1,则输出 0。
按位运算符可与等号(=)联合使用,以便合并运算及赋值:&=,|=和^=都是合法的(由于~是一元运算符,所以不可与=联合使用)。
6.移位运算 移位运算符面向的运算对象也是二进制的“位”。
可单独用它们处理整数类型(主类型的一种)。左移位运算符(<<)能将运算符左边的运算对象向左移动运算符右侧指定的位数(在低位补 0)。“有符号”右移位运算符(>>)则将运算符左边的运算对象向右移动运算符右侧指定的位数。“有符号”右移位运算符使用了“符号扩展”:若值为正,则在高位插入 0;若值为负,则在高位插入 Java也添加了一种“无符号”右移位运算符(>>>),它使用了“零扩展”:无论正负,都在高位插入 0。
若对 char,byte 或者 short 进行移位处理,那么在移位进行之前,它们会自动转换成一个 int。只有右侧的 5 个低位才会用到。这样可防止我们在一个 int数里移动不切实际的位数。
7.三元运算 if-else 布尔表达式 ? 值 0:值 1
8.逗号运算符 在 Java 里需要用到逗号的唯一场所就是 for 循环
9.字符运算符+ 运算符过载
如果想通过“加号”连接字串(使用 Java 的早期版本),请务必保证第一个元素是字串(或加上引号的一系列字符,编译能将其识别成一个字串)
10.造型运算 也就是类型强制转化 “造型”(Cast)的作用是“与一个模型匹配”。
对于boolean类型不允许造型,类的造型需要特定的转化,上溯造型。
float f4 = 1e-45f; // 10 to the power
float f4 = 1e-47f; //10 的幂数
通常,表达式中最大的数据类型是决定了表达式最终结果大小的那个类型。
执行控制:if-else while do-while for switch 但不支持 goto
if-else :
if(布尔表达式)
语句
或者
if(布尔表达式)
语句
else
语句
while:
while(布尔表达式)
语句
do-while:
do-while 的格式如下:
do
语句
while(布尔表达式)
for:
for(初始表达式; 布尔表达式; 步进)
语句
终端和继续:
在任何循环语句的主体部分,亦可用 break 和 continue 控制循环的流程。其中,break 用于强行退出循环,不执行循环中剩余的语句。而 continue 则停止执行当前的反复,然后退回循环起始和,开始新的反复。
“标签”是后面跟一个冒号的标识符,就象下面这样:
label1:
类似goto的跳转
label1:
外部循环{
内部循环{
//...
break; //1
//...
continue; //2
//...
continue label1; //3
//...
break label1; //4
}
}
在条件 1 中,break 中断内部循环,并在外部循环结束。
在条件 2 中,continue移回内部循环的起始处。
但在条件 3 中,continue label1 却同时中断内部循环以及外部循环,并移至 label1 处。随后,它实际是继续循环,但却从外部循环开始。
在条件 4 中,break label1 也会中断所有循环,并回到 label1 处,但并不重新进入循环。也就是说,它实际是完全中止了两个循环。
如果没有 break outer 语句,就没有办法在一个内部循环里找到出外部循环的路径。这是由于 break 本身只能中断最内层的循环(对于 continue 同样如此)。当然,若想在中断循环的同时退出方法,简单地用一个 return 即可
在 Java 里唯一需要用到标签的地方就是拥有嵌套循环,而且想中断或继续多个嵌套级别的时候。
开关:switch
switch(整数选择因子) {
case 整数值 1 : 语句; break;
case 整数值 2 : 语句; break;
case 整数值 3 : 语句; break;
case 整数值 4 : 语句; break;
case 整数值 5 : 语句; break;
//..
default:语句;
}
例子:
for (int i = 0; i < 6; i++) {
switch (i) {
case 0:
prtInt(i);
// break;
case 1:
prtInt(i);
// break;
case 2:
prtInt(i);
// break;
case 3:
prtInt(i);
// break;
case 4:
prtInt(i);
// break;
case 5:
prtInt(i);
// break;
default:
// break;
}
}
}
private static void prtInt(int i){
System.out.println("value is "+i);
}
结果:
value is 0
value is 0
value is 0
value is 0
value is 0
value is 0
value is 1
value is 1
value is 1
value is 1
value is 1
value is 2
value is 2
value is 2
value is 2
value is 3
value is 3
value is 3
value is 4
value is 4
value is 5
遇到case后就会一直运行一直到结束或者到break语句