Java中的对象类

时间:2020-01-09 10:34:49  来源:igfitidea点击:

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()方法的更多信息。