Java - 23 Object类详解
Java - 23 Object类详解
== 与 equals()
==
既可以判断基本类型也可以判断引用类型
- 判断基本类型,判断值是否相等
- 判断基本类型,判断地址是否相等(是不是一个对象)
equals
是Object类的方法,只能判断引用类型
- 默认判断地址是否相等
- 子类中往往重写该方法:Integer [判断值是否相等], String [判断内容是否相同]
// 自己重写 equals
class Person{
private String name;
private int age;
private char gender;
public boolean equals(Object obj){
// 判断是同一对象,直接返回 true
if(this == obj){
return true;
}
if(obj instanceof Person){
Person p = (Person)obj;
return this.name.equals(p.name) && this.age == p.age && this.gender == p.gender;
}
return false;
}
}
练习
int it = 65;
float fl = 65.0f;
it == fl; // true
char ch = 'A';
it == ch; // true
"hello" == new java.sql.Date(); // 编译报错
hashCode()
返回对象的哈希值
- 为了提高具有哈希结构的容器的效率
- 两个引用指向同一个对象,哈希值一定一样;指向不同对象,哈希值不一样(不严谨地说)
- 哈希值根据地址计算,但不能将哈希值等价为地址
一般是将对象的内部地址(真正的地址)转换为一个整数来实现,但Java跑在虚拟机上,所以无法得到对象真正的地址
toString()
默认返回:全类名 + @ + 哈希值的十六进制
-
子类往往重写
toString
方法 -
当直接输出一个对象时,
toString
方法会被默认调用
finalize()
当垃圾回收器确定 不存在对该对象的更多引用 时,由对象的垃圾回收器调用此方法
-
子类可以重写该方法,做一些释放资源的操作
-
当对象被回收(销毁)时,系统自动调用该对象的
finalize
方法
Car bmw = new Car("宝马");
bmw = null; // 这时,car对象就是一个垃圾,垃圾回收器会销毁这个对象,在销毁对象前,会调用该对象的finalize方法
程序员可以在 finalize
中写自己的业务逻辑(比如释放资源:数据库连接,打开文件...)
- 不是对象变成垃圾就马上回收,垃圾回收器有自己的算法,也可以通过
System.gc()
主动触发(不是一定触发)