请选择 进入手机版 | 继续访问电脑版
查看: 1637|回复: 0

【Java编程】Java Object类的方法

[复制链接]

  离线 

已抛锚 成长值: 850

  • TA的每日心情
    慵懒
    2020-6-24 10:54
  • 签到天数: 78 天

    [LV.6]常住居民II

    350

    主题

    406

    帖子

    2533

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    2533
    发表于 2019-11-1 19:21:46 | 显示全部楼层 |阅读模式
    来源: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语言在外面实现的。




    我知道答案 本帖寻求最佳答案回答被采纳后将获得系统奖励20 金钱 , 目前已有0人回答
    温馨提示:
    1、在论坛里发表的文章仅代表作者本人的观点,与本网站立场无关。
    2、论坛的所有内容都不保证其准确性,有效性,时间性。阅读本站内容因误导等因素而造成的损失本站不承担连带责任。
    3、根据二○○二年一月一日《计算机软件保护条例》规定:为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬!鉴于此,也希望大家按此说明研究软件!谢谢
    4、若因线路及非本站所能控制范围的故障导致暂停服务期间造成的一切不便与损失,论坛不负任何责任。
    5、注册会员通过任何手段和方法针对论坛进行破坏,我们有权对其行为作出处理。并保留进一步追究其责任的权利。
    6、本站所有资源来自互联网,版权归原作者所有,所有资源仅供于学习、交流研究,请于下载24小时之后删除!
    7、当您在浏览本站时,发现有您自己创作的原创资源时侵犯了您的合法资源时,请您及时联系管理员,邮箱:2550721739@qq.com,我们会及时处理!
    使用 高级模式(可批量传图、插入视频等)
    您需要登录后才可以回帖 登录 | 立即注册