软件构造一些易错知识点(1)

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值