当编译器观察到一个string后看紧跟一个+,而这个+后面紧跟一个非string类型的元素时,就会尝试将这个非string类型的元素转换为string。
赋值符号的左边必须是一个明确的,已命名的变量。必须有一个物理空间可以存储等号右边的值。但不能把任何东西赋给一个常数。常数不能为左值,基本类型存储了实际的数值,对一个对象进行操作时,真正操作的是对象的引用。
别名现象:
class tank{ int level; }
public class Assignment{
public static void main(Strubg args){
Tank t1 = new Tank();
Tank t2 = new Tank();
t1.level = 9;
t2.level = 10;
t1 = t2;
System.out.print("t1.level:"+t1.level+" t2.level:"+t2.level); //output: t1.level:12 t2.level:10
t1.level =11;
System.out.print("t1.level:"+t1.level+" t2.level:"+t2.level); //output: t1.level:11 t2.level:11
}
}
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';
System.out.print("1 x.c:"+x.c); //output 1 x.c:a
f(x);
System.out.print("2 x.c:"+x.c); //output 2 x.c:z
}
}
自增或自减有两种使用方式,通常被称为前缀式和后缀式。“前缀递增”表示操作符位于变量或表达式前面,而“后缀递增”表示操作符位于变量或表达式的后面。对于前缀递增或递减,会先执行运算,再生成值;而对于后缀递增或递减,则会先生成值,再执行运算 。他们是具有“副作用”的操作符(改变操作数)。
public class equivalence{
public static void main(String args[]){
Integer n1 = new Integer(47);
Integer n2 = new Integer(47);
System.out.print(n1 == n2); //output:false
System.out.print(n1 != n2); //output:true 对比的是对象的引用,而非引用所指向的值
}
}
class value{ int i; }
public class EqualsMethod{
public static void main(String args[]){
Value v1 = new Value();
Value v2 = new Value();
v1.i = v2.i =100;
System.out.print(v1.equals(v2));
}
}
直接常量后面的后缀字符标志了它的类型。若为大写的L,代表Long,若为F,则代表float,D代表Double。十六进制适用于所有整数数据类型,以前缀0x或0X,后面跟值0-9或大写a-f来表示。char,byte,short若超出范围,编译器会将自动值转换成int,八进制数由前缀o以及后面的0-7数字来表示,在C,C++或Java中,二进制数没有直接常量表示法。在使用十六进制和八进制记数法时,以二进制形式显示结果,通过使用Integer和Long类的静态方法toBinaryString()。
按位操作符用来操作整数基本数据类型中的单位“比特”(bit)。即二进制位。按位操作符符合对两个参数中对应的位执行布尔代数运算,并最终生成一个结果
规则:
若两个输入位都是1,则按位与&操作符生成一个输出位1,否则生成一个输出位0;若两个输出位只要有一个时1,则按位或|操作福生成一个输出位1;若输出位的某一个时1,但不全位1,那么按位异或^生成一个输出位1;按位非~也称取反操作,只对一个操作数进行操作,生成相反的值。
移位操作符的运算对象时二进制的位,移位操作福只可用来处理整数类型。左移位操作符<<能按照操作符右侧指定的位数将操作符左边的操作数向左移动(低位补0);有符号右移位<<操作符则按照操作符右侧指定的位数将操作符左边的操作数右移,有符号右移位操作符使用符号扩展:若符号位正,则在高位插入0,若符号位负,则在低位插入1.Java还增加了一种“无符号”右移操作符<<<,他使用零扩展,无论正负,都在高位插入0.
类转换是一种比较安全的操作。若要执行一种名为窄化转换(narrowing conversion)的操作,则可能面临信息丢失的危险,此时编译器会要求我们强制转换。对于扩展转换(widening conversion)则不必显式的进行类转换。在进行窄化转化时必须注意截尾与舍入问题。在float或double转型为整型值时总是对该数字执行截尾,若要获得舍入后的结果,需使用java.lang.Math中的方法round()。若是两个不同数据类型进行数学运算,最大的数据类型决定了表达式最终结果的数据类型。