前言
我们都知道,Java是一门面向对象的语言。同时,所有对象又继承Object这个基类,在Object类中,提供了8个默认的方法。因此,在Java语言中,所有的对象中,都有8个默认方法。那这8个默认的方法是什么呢?他们都有什么作用呢?
8大默认方法
我们打开Object
类,可以看到除了构造方法之外,还有8个方法:
- getClass()
- hashCode()
- equals()
- clone()
- toString()
- notify()
- wait()
- finalize()
这里,有我们常用的getClass()、toString()、equals()、hashCode()方法,也有我们不怎么使用的Clone()、notify()、wait()、finalize()方法,现在,我们就来看看这些方法有什么作用。
我们编写一个Person类:
getClass()
方法
getClass()
方法是我们比较常用的一个方法,我们在学习反射的时候,就常常使用getClass()方法来获取对象的运行时类。
Person person = new Person();
System.out.println(person.getClass());
运行结果:
我们可以看到,返回了person对象的引用。
hashCode()
hashCode()方法也是我们常用的一个方法,用来返回对象的一个hash值,在类被实例化成为对象时,他会拥有一个整形的一个变量,这个变量的值由对象的物理存储地址通过散列转换来的。
Person person = new Person();
System.out.println(person.hashCode());
如图所示,HashCode返回的hash值是一串数字,这串数组也被称作为对象的散列码。散列码是没有规律的,因此他也常常在Hash Table结构中,如HashMap中,当做索引来使用。但是,我们要注意的是,hash值并不是唯一的,他是有可能重复的,因此,即使hash值一致,也不能确定是否是同一个对象。
equals()
在开发过程中,我们常用equals方法来对比String字符串,看看他们是否相等。在Object中,equals方法用来判断两个对象是否相等,即判断两个对象的引用。
Person person = new Person();
Person person1 = person;
Person person2 = new Person();
System.out.println(person.equals(person1));
System.out.println(person.equals(person2));
那为什么在String类中,我们可以用equals来判断字符串相等呢?因为在String类中重写了equals方法,如果对象不相等,则判断对象中的char是否全部一致,再返回结果。
toString()
toString方法用来返回对象的对象值,我们常常重写toString方法,用来返回我们所需要的数据以及格式
clone()
clone方法我们用的比较少,要想使用clone方法,我们需要是类实现Cloneable接口。他用来返回该对象当前状态的一个克隆对象,这个克隆对象包含被克隆对象的所有方法和属性,且方法和属性值都一致:
public class Person implements Cloneable{
int i = 0;
@Override
protected Object clone() throws CloneNotSupportedException {
Person person;
i = 1;
person = (Person) super.clone();
return person;
}
}
// Main
Person person = new Person();
Person person1 = (Person) person.clone();
System.out.println(person);
System.out.println(person1);
person.i = 4;
System.out.println(person1.i);
System.out.println(person.equals(person1));
我们运行程序:
首先,我们发现两个对象并不相等,因为clone是返回一个新的对象。其次,我们在clone中更改了i的值,再执行super.clone(),此时,对象的i熟悉已经为1,因此,克隆对象的i也为1.
wait()
wait是多线程中的一个方法,使用了wait方法后,就会将对象的控制权交出去,对象就会进入等待态。无法继续操作对象。
notify()
当对象通过wait方法进入等待态后,无法操作对象,此时我们可以通过notify继续获取对象的控制权。
finalize()
当对象被JVM进行GC操作时,会执行finalize方法。
public class Person{
@Override
protected void finalize() throws Throwable {
System.out.println("我要死了……");
super.finalize();
}
}
// Main
Person person = new Person();
person = null;
System.gc();