1. 不可变类
不可变类是指一个对象一旦被创建出来,其整个生命周期中,它的成员变量就不能被修改。所有基本类型的包装类都是不可变类,例如Integer、Float、String类等。
创建不可变类的基本原则:1)类中所有成员变量被private修饰;2)类中没有写或者修改成员变量的方法(如setxxx),只提供构造函数,一次生成永久不变;3)确保类中所有方法不会被子类覆盖,可以通过把类或其方法定义为final;4)如果一个类成员不是不可变量,那么子成员初始化或者使用get方法获取该成员变量时,需要通过clone方法来确保不可变性;等
2. 值传递与引用传递
方法调用是需要传递一些参数来完成特定的功能。
1 值传递:方法调用中,实参会把中传递给形参,形参只是用实参的值初始化一个临时的存储单元,形参与实参的存储单元不同,形参的改变不会影响实参的值。
2 引用传递:传递的是对象,形参和实参的对象指向的是同一存储单元,形参会影响实参。
publicclass Test {
publicstaticvoidchangedStringBuffer(StringBuffer ss1,StringBuffer ss2){
ss1.append(" world");
ss2=ss1;
}
publicstaticvoid main(String[] args) {
Integer a=1;
Integer b=a;
b++;
System.out.println(a);
System.out.println(b);
StringBuffer s1=new StringBuffer("Hello");
StringBuffer s2 = new StringBuffer("Hello");
changedStringBuffer(s1, s2);
System.out.println(s1);
System.out.println(s2);
}
}
程序的运行结果:1 2 Hello world Hello
Integer同时按引用传递的,但是Integer是不可变类,没有提供改变值的方法。而是会创建一个新值为2的Integer复制给b,此时b与a已经没有关系。
ss1指向字符串的由hello变为Hello world(修改的是这个地址所指向字符串的值) ,从而修改s1的值。但是执行ss2=ss1时,相当于修改了函数内部的局部变量ss2,(这个修改与ss1无关)只会修改ss2的值而对s2无作用。由此可知引用传递不会改变实参的地址。
3. 不同数据类型的转换
转换规则:从低精度向高精度转换,优先级满足byte<short<char<int<long<float<double,
低级数据类型可以自动转换为高级数据类型。返回来使用强制类型转换。需要注意:
将两个short或byte类型的数据相加得到的是int类型,需要是short时需要显式的把int转换。如:shorts1=1;s1=s1+1;编译错误,因为这时s1+1结果是int类型,所以不能赋值个short类型的s1.但是”+=”可以通过编译:short s1=1;s1+=1正确。
4. 运算符的优先级
例如: int i=15; i>>2的结果是3,移出的部分将被抛弃。
0000 1111(15)右移2位的结果是0000 0011(3),0001 1010(18)右移3位的结果是0000 0011(3)。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
5. Math类中round、ceil和floor方法的功能
Math类中的方法全是静态方法。
1 round方法表示四舍五入,原理是将原来的数字先加0.5,然后再向下取整,等同于(int)Math.floor(x+0.5f),它的返回类型是int
2 ceil方法是向上取整。即取大于a的最小整数,它的返回类型是double,若a是正数则把小数“入”,是负数,则把小数“舍”。
3 floor方法是向下取整。返回类型是double,取小于a的最大整数。若a是正数,则把小数“舍”,是负数则“入”。
6. 实现无符号右移操作
>>(有符号右移)和>>>(无符号右移)。在进行>>操作时,若参与运算的数字为正数,则在高位补0;若为负数,则在高位补1;在进行>>>操作时,无论参与运算的数字正负,高位都补0。
7. char型变量中是否可存储一个中文汉字
java默认使用Unicode编码方式,即每个字符占用两个字节,英文占用一个字符,中文占用两个字符。