手机版
你好,游客 登录 注册
背景:
阅读新闻

Java Object类的方法

[日期:2018-08-06] 来源:Linux社区  作者:cjm09 [字体: ]

Java中,Object类是所有类的超类,所有的类都继承Object类中的方法。

Object类中有12个成员方法,并没有显示声明任何构造方法,而是存在着默认的无参的构造函数。

Object类源代码分析:

package java.lang;
 
  public class Object {
    //一个本地方法,具体是用C(C++)在DLL中实现的
      private static native void registerNatives();
      static {
          registerNatives();
      }
    //返回该Object的运行时类
      public final native Class<?> getClass();
   /*
    对于Object对象来说,返回对象的地址值。但一般在其他类中都会   
        重写hashCode方法,使其通过计算得到一个int值(hash值)重写
        hashcode方法时必须遵循以下几点:
    1、在Java应用的同一次执行过程中,同一对象被多次调用,则他们的
        hashcode值必然相同。而对于同一个应用的两次不同的调用,它们的
        hashcode值可以相同,也有可能不同。
    2、对于两个对象来说,如果他们的equals方法比较返回true,那么这
        两个对象的hashcode必然相同。这也解释了为什么String类中,如果
        两个对象的equals方法相同,则他们的hashcode值一定相同。
    3、对于两个对象来说,如果使用equals方法返回为false,则他们的
        hashcode的值有可能相等也可能不等,(如果不同会提高性能,因为
        在集合中类判断两个对象是否相等,如果其hashcode不等就直接不用
        判断equals方法了)
    4、对于Object对象来说,不同的Object对象的hashcode是不同的,
        它们返回的是对象的地址,equals返回的也是对象的地址。所以在自
        己定义的类中如果要添加到集合对象中,最好是要重写hashcode和
        equals方法,不然会自动继承自Object类中的两个方法根据对象地址
        来判断。在重写自己定义的类时,通常是在类中的根据某个值如
        name.hashcode();来进行判断。
   */
      public native int hashCode();
    //Object类中equals方法是比较两个对象的地址是否相同,而一般我们
      认为两个对象中只要属性相同,这两个对象就相同。所以一般其他类都
      会重写equals方法
      public boolean equals(Object obj) {
          return (this == obj);
      }
    //用来另存一个当前存在的对象
      protected native Object clone() throws     
      CloneNotSupportedException;
   //返回一个字符串,用来标识自己
      public String toString() {
          return getClass().getName() + "@" +
          Integer.toHexString(hashCode());
      }
   //唤醒在此对象监视器上等待的单个线程。如果有多个线程等待,则随
      机唤醒一个
      public final native void notify();
   //唤醒在此对象监视器上等待的所有线程
      public final native void notifyAll();
    //在其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超
      过指定的时间量前,导致当前线程等待
      public final native void wait(long timeout) throws
      InterruptedException;
   /*
  在其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者其他
      某个线程中断当前线程,或者已超过某个实际时间量前,导致当前线程
      等待
  */
      public final void wait(long timeout, int nanos) throws
      InterruptedException {
          if (timeout < 0) {
              throw new IllegalArgumentException("timeout value is
              negative");
          }
 
          if (nanos < 0 || nanos > 999999) {
              throw new IllegalArgumentException(
                                  "nanosecond timeout value out of range");
          }
 
          if (nanos >= 500000 || (nanos != 0 && timeout == 0)) {
              timeout++;
          }
 
          wait(timeout);
      }
    /*
        在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当
        前线程等待。换句话说,此方法的行为就好像它仅执行 wait(0) 调用
        一样。 
      当前线程必须拥有此对象监视器。该线程发布对此监视器的所有权并等
      待,直到其他线程通过调用 notify 方法,或 notifyAll 方法通知在此对
      象的监视器上等待的线程醒来。然后该线程将等到重新获得对监视器的
      所有权后才能继续执行。
      */
      public final void wait() throws InterruptedException {
          wait(0);
      }
   //当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收
      器调用此方法
      protected void finalize() throws Throwable { }
  }

通过Object类源码可以看到一些方法用native修饰,使用native修饰符修饰的方法需要非java语言来实现,比如C,C++。这个特征并非java所特有,很多其它的编程语言都有这一机制,比如在C++中,你可以用extern "C"告知C++编译器去调用一个C的函数。

在定义一个native method时,并不提供实现体(有些像定义一个java interface),因为其实现体是由非java语言在外面实现的。

Linux公社的RSS地址:https://www.linuxidc.com/rssFeed.aspx

本文永久更新链接地址https://www.linuxidc.com/Linux/2018-08/153382.htm

linux
相关资讯       Java Object  Object类 
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款