赋值
Data a = new Data();
Data b = new Data();
b = a;
这里的赋值是把a的引用赋给b,a没有了引用会被垃圾回收器自动清理。
1.方法调用中的别名问题
把除基本类型(int, double, float…)外的对象(包括数组)传递给方法,则方法可以修改该对象,因为传递给方法的是这个对象的引用。但是基本类型的话不行。
测试对象的等价性
Integer n1 = new Integer(1);
Integer n2 = new Integer(1);
n1 == n2 ? //false
n1 != n2 ? //true
n1,n2是两个对象的引用。如果要比较的话,应该用n1.equals(n2);但是这个equals方法并不适用于基本类型
class MyData{
int a;
}
MyData data1 = new Mydata();
data1.a = 1;
MyData data2 = new Mydata();
data2.a = 1;
data1.equals(data2); //false
因为equals(object类的方法)方法默认的是比较引用,除非在自己的新类中重写equals方法,才能比较值。
移位运算符
原码
反码 除符号位以外,各位取反
补码 反码+1
移码 对补码的符号位取反
阶码 在机器中表示一个浮点数时需要给出指数,这个指数用整数形式表示,这个整数叫做阶码,阶码指明了小数点在数据中的位置。
计算机中浮点数的表示:
IEEE754标准
32位浮点数中,S是符号位,占1位,S=0表示正数,S=1表示负数。M是尾数,占23位。E是阶码,占8位,阶符采用隐含方式,即采用移码方法来表示正负指数。采用这种方式时,将浮点数的指数真值e变成阶码E时,应将指数e加上一个固定的偏移值127(01111111),即E=e+127;
一个规格化的32位浮点数x的真值为: x = (-1)^S * (1.M) * 2^(E-127)
64位浮点数中符号位1位,阶码域11位,尾数域52位,指数偏移值是1023。
一个规格化的64位浮点数x的真值为: x = (-1)^S * (1.M) * 2^(E-1023)
其中尾数域所表示的值是1.M。由于规格化的浮点数的尾数域最左位(最高有效位)总是1,故这一位经常不予存储。于是23位字段可以存储24位有效数。
移位运算符只能操作整数。
在java中(c/c++也是)如int等存的是数据的补码形式。
“<
“>>”有符号的右移运算:
1. 符号为正,则在最高位插入0
2. 符号为负,则在最高位插入1
“>>>”无符号的右移运算:无论正负,都在最高位插入0;(c/c++中没有)
在c/c++中 true的值是1,false的值是0,if/while等的执行条件是非0,但是在java中boolean类型无法转换为int类型,if/while的条件必须是boolean类型的值。所以不会出现像if(a=1)这样的错误。
类型转换操作符
1.截尾与舍入
在java中,如果将浮点数,转换为整数,如 int a = (int)2.5; 总会截尾,只留下整数部分。若想用四舍五入的话,需要用到Math.round()方法。