一、使用Java运算符1、优先级
Java运算符优先级与C++类似,需要注意的是,最好不要依赖程序本身的优先级规则,而应该用括号明确规定计算顺序,以不必将自己的精力浪费在这些无谓的犄角旮旯。
2、赋值
赋值是用等号运算符=进行的,即“取得右边的值,把它复制到左边”。右边的值可以是任何值,但左边的值必须是变量,即必须有一个物理性的空间来保存右边的值,比如:string A = "hello world"。
需要注意的是:Java中类对象的赋值类似于C++中的引用赋值,在Java中叫做别名,但是对类对象的成员赋值则类似于C++中的赋值。举例说明如下:
class Number {
int i;
}
Number n1 = new Number();
Number n2 = new Number();
n1.i = 1;
n2.i = 2;
n1 = n2; //此时n1.i和n2.i都等于2
n1.i = 3; // 此时n1.i和 n2.i都等于3
n2.i = 4;
n1.i = n2.i; // 此时n1.i和 n2.i都等于4
n1.i = 5; // 此时n1.i等于5, n2.i都等于4
从上面结果可以看出,对于对象赋值即n1 = n2,无论n1还是n2都包含了相同的句柄,它们指向相同的对象(最初的句柄位于n1内部,指向容纳了值1的一个对象,在赋值过程中,那个句柄实际已经丢失可,它的对象会由“垃圾收集器”自动清除)。这种特殊的现象通常叫作“别名”,是Java操作对象的一种基本方式。
需要注意的是:用对象成员赋值虽然不会将n1和n2绑定到相同的对象,但是会使对象内部的字段处理发生混乱,在Java中不推荐这么做。
此外,将一个对象传递到方法或函数内部时,也会产生别名对象,也即Java中函数对象传参都是C++中的引用传参,不会在函数中产生对象副本。
3、算术运算符
Java的基本算术运算符与C++类似。
关于随机数的小技巧:为了生成数字,可以首先创建一个Random(随机)对象,由于自变量是在创建过程中传递的,所以Java将当前时间作为一个“种子值”,由随机数生成器利用,通过Random对象,程序可生成许多不同类型的随机数字,做法很简单,只需调用不同的方法即可,比如nextInt()、nextLong()、nextFloat或nextDouble(),如果随同随机数生成器的结果使用,模数运算符%可将结果限制到运算对象减1的上限(%100限制在99)之下。举例说明如下:
Random rand = new Random();
int i = rand.nextInt() % 100;
long j = rand.nextLong() % 100;
float k = rand.nextFloat();
double l = rand.nextDouble();
4、关系运算符
关系运算符生成的是一个布尔结果。它评价的是运算对象之间的关系,若关系是真实的,关系表达式会生成true,若关系不真实,则生成false。Java中关系运算符的规则同C++,唯一的例外是对象相等比较,举例说明如下:
//: Equivalence.java
public class Equivalence {
public static void main(String[] args) {
Integer n1 = new Integer(1);
Integer n2 = new Integer(1);
System.out.println(n1 == n2); //false
System.out.println(n1 != n2); //true
}
}
上面的结果会让C++码农们大跌眼镜,事实上,==和!=比较的是对象句柄而不是其值,虽然n1和n2的值都是1,但是句柄却是不同的。
若要比较两个对象的实际内容是否相等,必须要使用特殊方法equals(),但这个方法不适用于“主类型”(这些类型直接使用==和!=即可),将前面比较语句改成如下即可:
System.out.println(n1.equals(n2));
需要注意的是:equals()的默认行为是比较句柄,所以如果您创建了自己的类,就必须在自己的新类中重载equals(),否则,你还是会得到不相等的结果。
5、逻辑运算符
逻辑运算符&&、||以及!能生成一个布尔值true或false。
需要注意的是:只可将逻辑运算符用于布尔值,其它规则与C++类似。
6、按位运算符
位运算符Java与C++规则类似,针对的运算对象是二进制的“位”。
需要注意的是:按位运算符具有与逻辑运算符相同的效果,但是不会中途“短路”。
7、移位运算符
位运算符Java与C++规则类似,针对的运算对象是二进制的“位 ” 。
需要注意的是:Java中添加了一种“无符号”右移运算符>>>,它使用了“零扩展”,即无论正负,都在高位插入0.
8、字符串运算符+
这个运算符很有意思,它在Java里有一项特殊的用途:连接不通的字串,这点比C++要方便多了(C++中需要重载+运算符)。
字符串运算符+的规则是:如果表达式以一个String起头,那么后续所有运算对象都必须是字串,举例说明如下:
int x=0, y=1, z=2;
String str = "x, y, z";
System.out.println(str + x + y + z);
这里,Java编译器会将x、y和z自动转换成字串形式,而不是先把它们加到一起。
需要注意的是:Java早期版本中必须保证表达式的第一个元素必须是字串,否则编译会出错。
9、Java没有sizeof
在C++中,不同的CPU或操作系统或编译器都能影响到sizeof的大小,这点在C++面试题中屡见不鲜,这一点也体现了C++跨平台移植面临的问题。
庆幸的是,Java中所有数据类型在所有机器上大小都是相同,所以其是与平台无关的语言,也就不需要sizeof来满足C++那方面的需求。
10、强制类型转换
强制类型转换规则Java同C++,但是在Java中布尔类型是一个特例,不能将布尔进行强制类型转换成其它类型。
二、执行控制
Java的控制语句类似于C++,关键字也包括if-else、while、do-while、for和switch,不同的是Java不支持goto,但提供受局限的类goto跳转。
1、真和假
Java中不能像C++中用数字来当布尔值(真是非零,假是零)使用,必须用一个条件表达式来将数字转换成布尔值,比如:if (a != 0)。
2、选择语句
规则同C++,主要包括if-else和switch两种。
3、循环语句
规则同C++,包括while、do-while和for三类循环控制语句。
4、中断和继续
在任何循环语句的主体部分都可用break和continue来控制循环流程,规则同C++。
需要注意的是:在Java中可以用break和continue跟标签合用达到C++中goto的效果,但是标签在Java中被限制在只能在循环中使用。