前言

我们都知道,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());

运行结果:
image.png
我们可以看到,返回了person对象的引用。

hashCode()

hashCode()方法也是我们常用的一个方法,用来返回对象的一个hash值,在类被实例化成为对象时,他会拥有一个整形的一个变量,这个变量的值由对象的物理存储地址通过散列转换来的。

Person person = new Person();
System.out.println(person.hashCode());

image.png
如图所示,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));

image.png

那为什么在String类中,我们可以用equals来判断字符串相等呢?因为在String类中重写了equals方法,如果对象不相等,则判断对象中的char是否全部一致,再返回结果。
image.png

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));

我们运行程序:
image.png
首先,我们发现两个对象并不相等,因为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();

image.png