// Object.java - The root of all evil.

/* Copyright (C) 1998, 1999, 2000  Free Software Foundation

   This file is part of libgcj.

This software is copyrighted work licensed under the terms of the
Libgcj License.  Please consult the file "LIBGCJ_LICENSE" for
details.  */

package java.lang;

/**
 * @author Tom Tromey <tromey@cygnus.com>
 * @date September 30, 1998 
 */

/* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3
 * "The Java Language Specification", ISBN 0-201-63451-1
 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com.
 * plus gcj compiler sources (to determine object layout)
 * Status:  Complete to version 1.1
 */

public class Object
{
  // This must come first.  See _JvObjectPrefix in Object.h.
  protected void finalize () throws Throwable
  {
  }

  public final native Class getClass ();
  public native int hashCode ();
  public final native void notify ();
  public final native void notifyAll ();
  public final native void wait (long timeout, int nanos)
    throws InterruptedException;

  public boolean equals (Object obj)
  {
    return this == obj;
  }

  public Object ()
  {
  }

  public String toString ()
  {
    return getClass().getName() + '@' + Integer.toHexString(hashCode());
  }

  public final void wait () throws InterruptedException
  {
    wait (0, 0);
  }

  public final void wait (long timeout) throws InterruptedException
  {
    wait (timeout, 0);
  }

  protected native Object clone () throws CloneNotSupportedException;

  // This initializes the sync_info member.  It is here for
  // completeness (some day we'll be able to auto-generate Object.h).
  private final native void sync_init ();

  // Note that we don't mention the sync_info field here.  If we do,
  // jc1 will not work correctly.
}
