深入浅析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对象关联的资源。