Java中的对象类
Java类中的对象类(位于java.lang包中)是Java类层次结构的根。 Java中的每个类都直接或者间接继承自Object类。
如果Java类不扩展任何其他类,则它隐式扩展Object类,使其成为Object类的直接后代;如果Java类扩展其他类,则它也扩展Object类作为多级层次结构继承。
由于Java中的Object类是类层次结构的根,因此必须注意以下三点:
- 对象类是所有其他类的父类。
- 因为它是所有类的父类,所以Object类型的引用可以引用任何类的对象。
- 我们使用或者编写的每个类都继承Object类的实例方法。
Java Object类方法
对象类方法在每个对象中都可用。我们可能需要使用特定于类的代码覆盖这些方法。
equals()方法
equals()方法比较两个对象是否相等,如果相等则返回true。 Java Object类中提供的equals()方法使用身份运算符(==)来确定两个对象是否相等,仅当对象引用相等时,才为true。
为了测试两个对象是否包含相同的信息,必须重写equals()方法并提供唯一标识一个对象的实现。例如,重写equals()的Person类。
public class Person { ... public boolean equals(Object obj) { if (obj instanceof Person) return this.getId().equals((Person)obj.getId()); else return false; } }
请参阅Java中" =="运算符和equals()方法之间的区别,以了解有关equals()方法以及在何处使用的更多信息。
hashCode()方法
Object类中hashCode()方法的默认实现返回对象的哈希码,该哈希码是对象的内存地址(十六进制)。
如果我们覆盖equals()方法,则还必须覆盖hashCode()方法,因为这两个方法之间的一般约定表明:如果两个对象相等,则它们的哈希码也必须相等。
finalize()方法
Java中的Object类提供了一个回调方法finalize(),该方法可以在没有引用且即将被垃圾回收的对象上调用。
finalize()的对象类实现不执行任何操作,我们将必须重写finalize()方法以执行清理活动。
请注意,不建议使用Java 9中的finalize()方法。
- 请参阅Java中的finalize()方法以了解有关Java中的finalize()方法的更多信息。
clone()方法
clone()方法用于从现有对象创建副本。我们需要在现有对象上调用clone()方法来创建克隆。
exitingObj.clone();
为了使clone()方法正常工作,类或者其父类之一必须实现Cloneable接口。 clone()方法的对象类实现可验证在其上调用clone()的对象是否实现了Cloneable接口。如果对象不存在,则该方法将引发CloneNotSupportedException异常。
请参阅Java使用clone()方法进行对象克隆,以了解有关克隆方法的更多信息。
toString()方法
Object类的toString()方法返回该对象的String表示形式。默认实现以十六进制形式返回hashCode。
public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); }
由于对象的字符串表示形式完全取决于对象,因此我们必须在类中重写toString()方法并获取字段值并显示它,这有助于调试。
例如,如果Person类具有字段ID,名称和年龄,则可以重写toString()方法并获取所有字段值。
@Override public String toString() { StringBuffer sb = new StringBuffer(); sb.append("Id ").append(this.getId()).append(" Name ") .append(this.getName()).append(" Age ").append(this.getAge()); return sb.toString(); }
可以使用toString()方法显示的内容。System.out.println(" Person" + person.toString());
getClass()方法
getClass()方法返回一个Class对象。反过来,类对象具有提供有关类信息的方法。例如,我们可以通过调用getSimpleName()方法来获取类的名称,而通过调用getSuperclass()方法来获取其超类。
例如,如果要获取类名称并显示它。
Class c = person.getClass(); System.out.println("Class Name " + c.getSimpleName());
getClass()方法在Object类中被标记为final,因此不能被覆盖。
wait()方法
使当前线程等待,直到另一个线程为此对象调用notify()方法或者notifyAll()方法。
在Object类中也定义了wait方法的其他两种变体
wait(long timeout)使当前线程等待,直到另一个线程为此对象调用notify()方法或者notifyAll()方法,或者经过了指定的时间。
wait(long timeout,int nanos)使当前线程等待,直到另一个线程为此对象调用notify()方法或者notifyAll()方法,或者某个其他线程中断了当前线程,或者有一定的实时时间过去。
Object类中的所有这些wait()方法都标记为final,因此这些方法不能被覆盖。
notify()和notifyAll()方法
notify()唤醒在此对象的监视器上等待的单个线程。如果有任何线程在此对象上等待,则选择其中一个唤醒。
notifyAll()唤醒正在此对象的监视器上等待的所有线程。线程通过调用其中一个wait方法在对象的监视器上等待。
Object类中的notify()和notifyAll()方法都被标记为final,因此这些方法不能被覆盖。
请参阅Java中的wait(),notify()和notifyAll()方法,以了解有关wait(),notify()和notifyAll()方法的更多信息。