Java编程思想-第3章 操作符(要点)
在最底层,Java中的数据是通过使用操作符来操做的。 Java是建立在C++基础之上的,所以C和C++程序员应该非常熟悉Java的大多数操作符。当然,Java也做了一些改进与简化。
3.2 使用Java操作符
操作符接受一个或多个参数,并生成一个新值。参数的形式与普通的方法调用不同,但效 果是相同的。加号和一元的正号(+)、减号和一元的负号(-)、乘号(*)、除号(/)以及赋值 号(=)的用法与其他编程语言类似 操作符作用于操作数,生成一个新值。另外,有些操作符可能会改变操作数自身的值,这 被称为“副作用”。那些能改变其操作数的操作符,最普遍的用途就是用来产生副作用;但要记 住,使用此类操作符生成的值,与使用没有副作用的操作符生成的值,没有什么区别 几乎所有的操作符都只能操作“基本类型”。例外的操作符是“=”、“==”和“!=”,这些 操作符能操作所有的对象(这也是对象易令人糊涂的地方)。除此以外, String类支持“+”和 “+=”。
3.3 优先级
当一个表达式中存在多个操作符时,操作符的优先级就决定了各部分的计算顺序。Java对 计算顺序做了特别的规定。其中,最简单的规则就是先乘除后加减。程序员经常会忘记其他优 先级规则,所以应该用括号明确规定计算顺序。
3.4 赋值
赋值使用操作符“=”。它的意思是“取右边的值(即右值),把它复制给左边(即左值)”。 右值可以是任何常数、变量或者表达式(只要它能生成一个值就行)。但左值必须是一个明确的 已命名的变量。也就是说,必须有一个物理空间可以存储等号右边的值。举例来说,可将一个 常数赋给一个变量: 但是不能把任何东西赋给一个常数,常数不能作为左值(比如不能说4=a;)。 对基本数据类型的赋值是很简单的。基本类型存储了实际的数值,而并非指向一个对象的 引用,所以在为其赋值的时候,是直接将一个地方的内容复制到了另一个地方。例如,对基本 数据类型使用a=b,那么b的内容就复制给a。若接着又修改了a,而b根本不会受这种修改的影响。 作为程序员,这正是大多数情况下我们所期望的。 但是在为对象“赋值”的时候,情况却发生了变化。对一个对象进行操作时,我们真正操 作的是对对象的引|用。所以倘若“将一个对象赋值给另一个对象”,实际是将“引「用”从一个地 方复制到另一个地方。这意味着假若对对象使用c=d,那么c和d都指向原本只有d指向的那个对象。
3.4.1 方法调用中的别名问题
将一个对象传递给方法时于,也会产生别名问题
//: operators/Passobject. java
// Passing objects to methods may not be
//what you're used to
import static net mindview util. Print.*
class letter{
char c;
}
public class Passobject {
static void f(letter y) {
y.c='z';
}
public static void main (String[] args){
Letter x = new Letter();
x.c = 'a';
print("1:x.c :" + x.c) ;
f(x);
print("2:x.c :" + x.c) ;
}
}
/*Output:
//1: x.c: a
//2: x.c: z
*///:
在许多编程语言中,方法0似乎要在它的作用域内复制其参数 Letter y的一个副本;但实际 上只是传递了一个引用。所以代码行 y.c = 'z'; 实际改变的是f()之外的对象。 别名引|起的问题及其解决办法是很复杂的话题,本书的在线补充材料涵盖了此话题。但是 你现在就应该知道它的存在,并在使用中注意这个陷阱。
3.5 算术操作符
Java的基本算术操作符与其他大多数程序设计语言是相同的。其中包括加号(+)、减号(-) 除号(1)、乘号(*)以及取模操作符(%,它从整数除法中产生余数)。整数除法会直接去掉结 果的小数位,而不是四舍五入地圆整结果。 Java也使用一种来自C和C++的简化符号同时进行运算与赋值操作。这用操作符后紧跟一个 等号来表示,它对于Java中的所有操作符都适用,只要其有实际意义就行。例如,要将x加4, 并将结果赋回给x,可以这么写:x+=4。
3.5.1 一元加、减操作符
x = -a;
编译器能正确识别下述语句:
x = a * -b;
但读者会被搞糊涂,所以有时更明确地写成:
x = a * (-b);
3.6 自动递增和递减
3.7 关系操作符
关系操作符生成的是一个 boolean(布尔)结果,它们计算的是操作数的值之间的关系。如 果关系是真实的,关系表达式会生成true(真);如果关系不真实,则生成fale(假)。关系操 作符包括小于(<)、大于(>)、小于或等于(<=)、大于或等于(>=)、等于(==)以及不等于 (!=)。等于和不等于适用于所有的基本数据类型,而其他比较符不适用于 boolean类型。因为 boolean值只能为true或 false,“大于”和“小于”没有实际意义
3.7.1 测试对象的等价性
关系操作符==和!=也适用于所有对象,但这两个操作符通常会使第一次接触Java的程序员 感到迷惑。下面是一个例子
//:operators/Equivalence
java public class Equivalence {
public static void main(String[] args){
Integer n1 =new Integer(47);
Integer n2 new Integer(47);
System.out.printin(n1 = n2);
System.out.printin(n1 ! n2);
}
}
/* Output
false
true *///:
语句 System. out. println(m1==n2)将打印出括号内的比较式的布尔值结果。读者可能认为输 出结果肯定先是true,再是 false,因为两个 Integer对象都是相同的。但是尽管对象的内容相同, 然而对象的引用却是不同的,而==和!=比较的就是对象的引引「用。所以输出结果实际上先是 false, 再是tue。这自然会使第一次接触关系操作符的人感到惊奇。 如果想比较两个对象的实际内容是否相同,又该如何操作呢?此时,必须使用所有对象都 适用的特殊方法 equals。但这个方法不适用于“基本类型”,基本类型直接使用==和!=即可。
3.8 逻辑操作符
逻辑操作符“与”(&&)、“或”()、“非”(!)能根据参数的逻辑关系,生成一个布尔值 true或 false)。下面这个例子就使用了关系操作符和逻辑操作符。 3.8.1短路 当使用逻辑操作符时,我们会遇到一种“短路”现象。即一旦能够明确无误地确定整个表 达式的值,就不再计算表达式余下部分了。因此,整个逻辑表达式靠后的部分有可能不会被运 算。
3.9 直接常量
般说来,如果在程序里使用了“直接常量”,编译器可以准确地知道要生成什么样的类型 但有时候却是模棱两可的。如果发生这种情况,必须对编译器加以适当的“指导”,用与直接量 相关的某些字符来额外增加一些信息。下面这段代码向大家展示了这些字符。
3.10 按位操作符
按位操作符用来操作整数基本数据类型中的单个“比特”(bit),即二进制位。按位操作符 会对两个参数中对应的位执行布尔代数运算,并最终生成一个结果。 按位操作符来源于C语言面向底层的操作,在这种操作中经常需要直接操纵硬件,设置硬件 寄存器内的二进制位。Java的设计初衷是嵌入电视机机顶盒内,所以这种面向底层的操作仍被 保留了下来。但是,人们可能不会过多地用到位操作符。
3.11 移位操作符
3.12 三元操作符
boolean-exp ? value0 : value1;
3.13 字符串操作符 + 和 +=
3.15 类型转换操作符
3.16 Java没有sizeof
3.18 总结 多种操作符并用,要处处小心。

浙公网安备 33010602011771号