1.final 关键词
.final 关键词:修饰的变量无法改变引用。
所以如果用final 修饰不可变类型,则无法再次赋值。
final int a = 5;
a = 10; //错误
2.考虑下面代码
public class Person {
...
private Date birth;
public Person(...) {
...
}
public Date getBirth() {
return birth;
}
...
如果在客户端我们想要获取某人出生的生日,就可能会因某些操作改变内部状态,因为存在内部信息泄露。
可改为:
public class Person {
...
private Date birth;
public Person(...) {
...
}
public Date getBirth() {
return new Date(birth.toString()); //防御式拷贝
}
...
}
3.重写与重载
重写方法与父类名字、参数列表、返回值类型完全相同,在运行阶段判断到底用哪个方法;
重载与父类具有同样的名字,但有不同的参数列表或返回值类型 ,在编译阶段判断到底用哪个方法。
4.==与.equals()
在java中,“==”主要有两个作用
1)对基础数据类型:比较的是他们的值是否相等,比如两个int类型的变量,比较的是变量的值是否一样。
2)对引用数据类型:比较的是引用的地址是否相同,即是否指向同一个区域。
在java中,.equals()的作用
.equals()方法在Object中就有,其作用与“==”的 2)一样,比较的是引用的地址是否相同,即是否指向同一个区域。
这样看来.equals()似乎没有存在的意义。
然而在一些类型中,比如String,Integer,Date中重写了.equals(),此时.equals()的作用发生改变,比较的是内容是否相同而非之前的比较引用。
5.自动装箱与拆箱
下面代码合法:
Integer a = 1;//装箱
int b = a;//拆箱
考虑下面代码
Integer a = 1;
Integer b = 1;
Integer c = 1000;
Integer d = 1000;
System.out.println(a == b);
System.out.println(a.equals(b));
System.out.println(c == d);
System.out.println(c.equals(d));
似乎结果应为false,true,false,true。(引用不同,内容相同,引用不同,内容相同)。
然而实际运行true,true,false,true。
原因: 数值在-128 ~ 127之间,同一个值的所有封装共用同一个对象,这发生在AutoBoxing(装箱)过程中。
如果要避免这种情况,可以:
Integer a = new Integer(1);
Integer b = new Integer(1);
System.out.println(a == b);//此时引用不同,结果为false