MENU

Java-29 Object类及其方法

September 23, 2023 • Read: 84 • Java阅读设置

面向对象编程

Object类

1 关于Object类

java.lang.Object,即我们所说的Object类是所有类的根父类。我们所说的可以理解为是引用数据类型,也就是说,Object类是所有引用数据类型的直接或间接父类,总之就是所有的父类。

对于那些没有使用extends关键字指明其直接父类的,它们的直接父类就是Object类。

由于Object类是所有类的父类,因此,所有类都具备Object类的成员,也就都可以使用Object类中的成员,通常就是使用其中的方法。
换句话说,Object类中的方法是通用方法、所有类都适用的方法。

2023-09-23T14:23:34.png

2 Object类中的成员

1)属性
Object类中没有定义属性。

2) 构造器
Object类中只有一个空参构造器。
2023-09-23T14:22:40.png

3)方法

  • clone():

    • protected Object clone() throws CloneNotSupportedException
    • 简单地说,该方法x.clone()就是复制一份x对象,返回值就是x的复制对象,它与x的互相独立的。详细地细节,需要学习包括接口的其他知识。
  • equals():

    • public boolean equals(Object obj)
    • equals()方法常常与==比较,这里将二者详细说明一下:
      (1)==:

      • 是运算符,适用于基本数据类型变量和引用数据类型变量,左右两边的变量必须是统一的,也就是说能够统一成一个类型。
      • ==本质上比的是两个变量对应的存储空间中的值。也就是说,对于基本数据类型,==比较的是两个基本数据类型的值,对于引用数据类型,==比较的是两个引用数据类型变量对应的存储空间中保存的地址值。
        (2)equals():
      • 是方法,因此只适用于(非null)对象。
      • 没有重写的Objectequals()方法,本质上就是利用==来比较两个对象,也就是仍然是比较两个对象的地址值。
        2023-09-25T14:09:40.png
      • 通常,像String、Date、File、包装类等都重写了Object类中的equals()方法,实现的就是比较两个对象的内容是否相同。对于同一个类的两个实例化对象,它们的内容本质上就是属性和方法,方法都是类中的,所以都是一致的,只有属性是实例化时初始化的,可能不同,因此重写equals()方法就是比较两个对象的属性是否相同。
        2023-09-25T14:09:59.png
        2023-09-25T14:10:34.png
      • 一般情况,我们自定义的类都会重写Object中的equals()方法,实现对两个对象的内容的比较。通常,我们是通过自动实现的。自动实现时会发现,自动代码中特别注意了null,并且在重写equals()方法的同时会重写hashCode()方法,具体参照Object类中的equals()方法的解释。
        2023-09-25T14:17:28.png
        2023-09-25T14:19:40.png
      • 官方解释equals()方法,主要注意以下几点:
        (1)equals()方法比较的是非null对象,任何对象与null通过equals比较结果都是false
        (2)equals()方法的原型,即未重写的代码,本质上是==比较。
        (3)重写equals()方法必须也重写hashCode()方法,因为要求通过equals()方法判断的两个相等的对象,其二者的hashCode也相等。
        2023-09-25T14:23:02.png
  • finalize():

    • protected void finalize() throws Throwable
    • 简单地说,该方法x.finalize是由垃圾回收器来调用,当垃圾回收器确定没有任何引用指向x了,此时垃圾回收器就想要将x作为垃圾回收,在垃圾回收器做这个操作之前,会调用x.finalize。也就是说,在x没有被任何指针指向后,在垃圾回收器要将x作为垃圾处理之前,x.finalize方法会被调用,调用后不代表x就会被回收,因为有可能finalize方法本身实现了对x的重新引用,这时x就不会被垃圾回收器处理。
    • 在对象被回收之前,垃圾回收器会调用该对象的finalize方法,不建议主动去调用该方法,一般由垃圾回收器自动地调用该方法。
  • getClass():

    • public final Class<?> getClass()
    • 简单地说,该方法x.getClass()用于返回x的所属类对象。也就是说,该方法返回的是构造出x的类。后续学习会进一步学习该方法。
  • hashCode():

    • public int hashCode()
    • 待补充(集合)
  • notify():

    • public final void notify()
    • 待补充(线程通信)
  • notifyAll():

    • public final void notifyAll()
    • 待补充(线程通信)
  • toString():

    • public String toString()
    • toString()方法返回的是代表该对象的字符串。
      没有被重写的Object类中的toString()方法返回的代表对象的字符串是由该对象的类名、@和该对象的哈希代码的无符号十六进制所构成。具体参照官方文档中所给出的定义。
      简单地说,Object类中的toString()方法返回的是该对象的地址值。
      2023-09-26T14:25:19.png
    • 需要注意的是,在使用print来打印一个没有重写toString()方法的对象时,打印结果也是该对象的地址值,实际上,print一个对象的本质就是调用了该对象的toString()方法。
      但需要注意一点,对于声明为null的某个类的变量,print打印中有一个保护机制会判断打印的变量是否是null,如果是null则直接打印null,只有非null时才会去调用对应的toString()方法。因为值为null的对象调用方法会报空指针异常错误。
    • 像String、Date、File、包装类等都重写了Object类中的toString方法。重写toString()方法的目标是能够得到最能代表该对象的字符串,通常就是我们对这个对象最关心的属性。一般选择自动生成重写该方法的代码。
      2023-09-26T14:24:59.png
  • wait():

    • public final void wait() throws InterruptedException
    • 待补充(线程通信)
  • wait(long timeout):

    • public final void wait(long timeout) throws InterruptedException
    • 待补充(线程通信)
  • wait(long timeout, int nanos):

    • public final void wait(long timeout, int nanos) throws InterruptedException
    • 待补充(线程通信)
Last Modified: October 2, 2023