Object类中常用的方法:
返回值类型 | 方法名 | 作用 |
protected Object | clone() | 创建并返回此对象的一个副本 |
boolean | equals(Object obj) | 指示某个其它对象是否与此对象“相等” |
protected void | finalize() | 但垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法 |
Class<?extends Object> | getClass() | 返回一个对象的运行时类 |
int | hashCode() | 返回一个对象的哈希码值 |
void | notify() | 唤醒在此对象监视器上等待的单个线程 |
void | notifyAll() | 唤醒在此对象监视器上等待的所有线程 |
String | toString() | 返回该对象的字符串表示 |
void | wait() | 导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法。 |
void | wait(long timeout) | 导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超过指定的时间量。 |
void | wait(long timeout,int nanos) | 导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者其他某个线程中断当前线程,或者已超过某个实际时间量。 |
1. toString
先看这个案例:
package tt;
public class Person {
public String name;
public int age;
public Person(String name,int age){
this.name=name;
this.age=age;
}
}
package tt;
public class Test {
public static void main(String[] args) {
Person p=new Person("小明",99);
System.out.println(p);
}
}
执行结果:
通过这个案例,发现了一个问题:为什么打印p的结果会是这么一段字符串?
然后通过查看源码的方式,弄明白了这个逻辑。
public void println(Object x) {
String s = String.valueOf(x);
synchronized (this) {
print(s);
newLine();
}
这个println方法里的第一行源码调用了String类的valueOf方法,
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
而通过读这一段源码发现最后是会调用Object类的toString方法,
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
这个toString方法里所返回的就是最后打印p出来的结果。我们可以把它理解成一个“地址”。
接下来通过在Person类里重写toString方法,看一下运行结果。
package tt;
public class Person {
public String name;
public int age;
public Person(String name,int age){
this.name=name;
this.age=age;
}
public String toString() {
return "姓名:" + name +"\t"+ "年龄:" + age ;
}
}
package tt;
public class Test {
public static void main(String[] args) {
Person p=new Person("小明",99);
System.out.println(p);
}
}
这就说明了在打印p的时候默认调用了Object类里的toString方法。若是在Person类里重写toString方法,则在打印p的时候会先调用重写的toString方法。
2. equals和==之间的区别
1.对于==,如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等;
如果作用于引用类型的变量,则比较的是所指向的对象的地址
2.对于equals方法,注意:equals方法不能作用于基本数据类型的变量。
如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;
诸如String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容。
3.为什么在重写hashCode方法时,要重写equals方法,两者有什么关系?
1.在hashCode方法中有那么一个约定:相同对象必须有相同哈希值。在一个类中,如果重写的equals方法,没有重写hashCode方法时,会出现equals相等,哈希值不相等。就没有遵守hashCode方法的约定。
2.通过使用hashCode方法可以提前校验,可以避免每一次比较都用equals方法从而提高效率。