操作符
控制执行流程
1.赋值运算符引起的别名现象
Class Tank{
int level;
}
public class Assignment{
public static void main(String[] args){
Tank t1 = new Tank();
Tank t2 = new Tank();
t1.level = 9;
t2.level = 47;
t1 = t2;//t1与t2是相同的引用,t1此时指向47
t1.level = 27;//t1与t2都指向27
}
}
为使t1和t2相互独立,不能直接t1=t2
,而是要采用:
t1.level = t2.level;
将对象传递给方法也会出现相同的问题。
public class PassObject{
static void f(Letter y){
y.c = 'z';
}
}
若调用f(x)
,无论之前x.c
的值为多少,最后都会等于’z’。
2.Random类
如果创建过程中没有传递任何参数,那么Java会将当前时间作为随机数生成器的种子。
可以通过在创建Random对象时提供相同的种子,来产生相同的随机数序列。
3.关系操作符
==和!=号在测试对象的等价性时容易让人感到迷惑。
public class Equivalence{
public static void main(String[] args){
Integer n1 = new Integer(47);
Integer n2 = new Integer(47);
System.out.println(n1 == n2);//不为同一引用,返回结果为false
System.out.println(n1 != n2);//返回true
}
}
为比较两个对象的实际内容是否相同,需要引入特殊方法equals()
:
System.out.println(n1.equals(n2));//n1,n2均为Integer类创建的对象,返回为true!
但是事情并没有那么简单~如果创建了新类。这样直接比较数据成员的大小就行,没必要用equals。
Class Value{
int i;
}//……
v1.i = v2.i = 100;
System.out.println(v1.equals(v2));//返回为false
比较基本数据类型的值,用==。比较两个引用是否指向同一个对象,用==。比较两个引用的值是否相等,用a.equals(b)。
4.逻辑运算符
注意逻辑运算符(逻辑表达式)与按位运算符(位)的区别。
非布尔值不可以在逻辑运算中使用。
短路现象:一旦逻辑表达式的值已经确定,后面的部分不再进行计算。
5.移位操作符
左移操作符(<<)可以按照操作符右侧指定的二位数将操作符左边的操作数向左移动,在低位补0。
”有符号“右移操作符(>>)按照操作符右侧指定的二位数将操作符左边的操作数向右移动,若符号为正,在高位插入0,若为负,插入1。
“无符号”右移操作符(>>>),无论正负,在最高位插入0.
移位可以与等号(<<=或>>=或>>>=)组合使用,在完成移位之后,会将得到的结果赋给左边的变量。
6.字符串操作+和+=
public class StringOperators{
public static void main(String[] args){
int x = 0, y = 1, z = 2;
string s = "x, y, z ";
System.out.println(s + x + y + z);//输出为"x, y, z 012"
s += "(summed) = ";//连接字符串
System.out.println(s + (x + y + z));//输出为"x, y, z (summed) = 3"
}
}
7.类型转换
扩展转换 自动进行
窄化转换 显式进行 比如在对float进行初始化时,就必须在后面标注f。
在将float或者double转型为整型值,总会对数据进行截尾。如果要得到四舍五入的结果,就需要用到round()方法。
double above = 0.4;
Math.round(above);
8.break与continue
break:跳出当前循环
continue:结束当前循环之后的语句,跳回当前循环的开头并执行下一次循环
带标签的break:中断并跳出带标签的循环
标签语法:
label:
for(;true;i++) {
if(i==3) {
System.out.println(i);
continue label;
}
if(i==6) {
System.out.println(i);
break label;
}
}