c语言编程笔录

首页 >   > 笔记大全

笔记大全

深入浅析Java中的Object类

更新时间:2023-07-11

第一段:Object类概述

Object是所有Java类的祖先类,它是Java中最通用的类,所有其它的Java类都是继承自Object类(当然也包括一些基本数据类型的封装类)。如果一个类没有显式地继承某个类,那么这个类默认继承Object类。

public class MyClass {
  // 类定义
}

上面这个类代码并没有继承任何类,所以隐式地继承了Object类。

第二段:Object类方法

在Object类中定义了一些常用方法供其它类使用,它们分别是:

  • public final native Class<?> getClass()
  • public boolean equals(Object obj)
  • protected native Object clone() throws CloneNotSupportedException
  • public int hashCode()
  • public String toString()
  • public final native void notify()
  • public final native void notifyAll()
  • public final native void wait(long timeout) throws InterruptedException
  • public final void wait(long timeout,int nanos) throws InterruptedException
  • public final void wait() throws InterruptedException
  • protected void finalize() throws Throwable
public class MyClass {
  public static void main(String[] args) {
    // 使用getClass方法获取类对象
    MyClass myObject = new MyClass();
    Class c = myObject.getClass();
    System.out.println(c.getName()); // 打印类名
  }
}

上面这个例子使用Object类中的getClass方法获取MyClass类的Class对象,并打印了类名。

第三段:equals和hashCode方法

Object类中的equals方法比较的是对象的内存地址,通常我们需要自定义此方法来比较对象的实际内容。hashCode方法返回一个对象的哈希码,用于散列数据结构中的键值匹配。

public class Person {
  private String name;
  private int age;
  
  // 构造方法和其它方法省略
  
  @Override
  public boolean equals(Object obj) {
    if (obj == this) {
      return true;
    }
    if (obj == null || obj.getClass() != this.getClass()) {
      return false;
    }
    Person person = (Person) obj;
    return person.name.equals(name) && person.age == age;
  }
  
  @Override
  public int hashCode() {
    int result = 17;
    result = 31 * result + name.hashCode();
    result = 31 * result + age;
    return result;
  }
}

上面这个例子重写了equals和hashCode方法,以便在使用HashMap或HashSet等散列数据结构时能够正确处理Person类的实例。

第四段:Cloneable接口和finalize方法

Object类中的clone方法用于创建一个新的对象,并将原对象的值复制到新对象中。该方法非常神奇,因为它是唯一一个不经过构造器而直接创建对象的方式。但是使用这个方法有一些需要注意的地方,因为它的实现和传统的面向对象编程有些不同。这里不详细说明,有兴趣的读者可以进一步了解。

Object类的finalize方法在垃圾回收器回收对象之前被调用。该方法可以用来释放一些与对象关联的资源。

public class Person implements Cloneable {
  private String name;
  private int age;
  
  // 构造方法和其它方法省略
  
  @Override
  public Object clone() throws CloneNotSupportedException {
    return super.clone();
  }
  
  @Override
  protected void finalize() throws Throwable {
    // 释放一些资源
  }
}

上面这个例子实现了Cloneable接口并重写了clone方法,以便在需要复制Person类对象时能够正确使用。同时还重写了finalize方法,以释放与Person对象关联的资源。