浅谈Object类中的部分方法
类 Object 类层次结构的根类。每个类都使用 Object 作为父类。所有对象都实现这个类的方法。
Object类中的部分方法
- String toString()
- boolean equals(Object object)
- protected void finalize()
- int hashCode()
1.toString()方法
- toString方法源代码
public String toString(){
getClass().getName() + '@' + Integer.toHexString(hashCode());
}
1. 由源代码可知toString()方法的默认实现方式是:类名@对象的内存地址经过哈希算法转换为十六进制的形式。
2. toString()方法的设计目的是返回对象的字符串表示形式,通过调用此方法可以将一个“Java对象”转换成“字符串”表示形式。
3. 其结果应该是一个简介详实的,建议所有子类都重写此方法(SUN公司规定)。
public class MyTime {
int year;
int month;
int day;
public MyTime() {
}
public MyTime(int year, int month, int day) {
this.year = year;
this.month = month;
this.day = day;
}
public static void main(String[] args) {
MyTime myTime = new MyTime(2008,8,8);
System.out.println(myTime.toString());
}
}
//在没有重写toString()方法之前,创建一个MyTime对象调用toString方法输出的结果为MyTime@b4c966a
//显然这种输出结果并不简洁详实,并不符合我们的预期,当一个日期对象转换为字符串对象的时候,我们希望看到的仍然是具体的日期信息,而不是对象的内存地址,所以需要重写toString方法
public class MyTime {
int year;
int month;
int day;
public MyTime() {
}
public MyTime(int year, int month, int day) {
this.year = year;
this.month = month;
this.day = day;
}
@Override
public String toString() {
return "MyTime{" +
"year=" + year +
", month=" + month +
", day=" + day +
'}';
}
public static void main(String[] args) {
MyTime myTime = new MyTime(2008,8,8);
System.out.println(myTime.toString());
}
}
//当重写了toString()方法后在输出的结果为MyTime{year=2008, month=8, day=8},显然这种输出结果才符合我们预期的效果
2.equals()方法
1.SUN公司设计equals()方法的目的是通过equals方法来判断两个对象是否相等,显然SUN公司给的equals方法并不够用。
2.判断两个基本数据类型是否相等可以使用==进行,但是如果是判断两个引用数据类型还可以使用==进行判断吗?
public class MyTime {
int year;
int month;
int day;
public MyTime() {
}
public MyTime(int year, int month, int day) {
this.year = year;
this.month = month;
this.day = day;
}
@Override
public String toString() {
return "MyTime{" +
"year=" + year +
", month=" + month +
", day=" + day +
'}';
}
public static void main(String[] args) {
MyTime time1 = new MyTime(2008,8,8);
MyTime time2 = new MyTime(2008,8,8);
System.out.println(time1==time2);//输出结果为false
}
}
==保存的是对象的内存地址,time1和time2是两个不同的对象,保存的是两个不同的内存地址,所以输出的结果为false。示例中的==判断的是time1中的内存地址和time2中的内存地址是否相同,输出的结果自然为false,但是我们确确实实是创建了两个都为2008年8月8日的日期对象,显然是用==来进行判断两个引用数据类型是否相等的话结果就会永远都是false,这种方式并不合适,所以需要子类重写equals()方法来对引用数据类型是否相同进行比较。
- equals()方法源代码
public boolean equals(Object object){
return (this==obj);
}
//以上这个方法是Object类的默认实现,该默认的equals方法仍然使用的==对this的对象和obj对象进行比较,输出结果也是永远为false,所以要想使用equals方法对两个引用数据类型进行比较的话,就必须要重写equals方法
public class MyTime {
int year;
int month;
int day;
public MyTime() {
}
public MyTime(int year, int month, int day) {
this.year = year;
this.month = month;
this.day = day;
}
@Override
public String toString() {
return "MyTime{" +
"year=" + year +
", month=" + month +
", day=" + day +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
MyTime myTime = (MyTime) o;
return year == myTime.year &&
month == myTime.month &&
day == myTime.day;
}
public static void main(String[] args) {
MyTime time1 = new MyTime(2008,8,8);
MyTime time2 = new MyTime(2008,8,8);
System.out.println(time1==time2);//输出结果为true
}
}
3.finalize()方法
- 源代码
protected void finalize() throws Throwable{}
1. finalize()方法只有一个方法体,里面没有代码,而且这个方法是protected修饰的。
2. 这个方法不需要手动调用,JVM的垃圾回收器负责调用这个方法。
3. finalize()方法的执行时机,当一个Java对象即将被垃圾回收期回收的时候,GC负责调用这个方法。
4. 这个方法的意义是SUN公司为Java程序员准备一个垃圾销毁时机,如果希望对象在销毁时机执行一段代码的话,这段代码就要写到finalize()方法中,和静态代码块类似,静态代码块在类加载时刻执行并且只执行一次,是SUN公司准备的类加载时机。
4.hashCode()方法
- 源代码
public native int hashCode();
1. 这个方法带有native关键字,底层调用C++程序。
2. hashCode()方法返回的是哈希码,实际上是一个Java对象的内存地址,经过哈希算法得出的一个值,所以该方法的执行结果可以等同的看作一个Java对象的内存地址。

浙公网安备 33010602011771号