`

Object类详解三

 
阅读更多
Object类解析

好久没来写。最近看到同学也在写,也跟着一起做共同撰稿人。顺便把我在那边发表的文章也挂到这边。看来写Blog也要一起写才有动力哟 。。。

为了更好地了解JAVA,使用JAVA,个人认为学习JAVA类库是会有很大帮助的。限于个人水平,仅在此抛玉引砖,望大家不吝赐教。对于本地方法的调用,在本人研究之后再补上。[separator]
这里使用的源代码为Eclipse 3.2.2自带的。猜测应该是Java5的源代码,也有可能是Java6啦,没仔细找。

第一次我们就先看看始祖类.
public class Object {

     /**
      * 为了能调用本地方法。      */
       private static native void registerNatives();
       static {
           registerNatives();
       }

       /**
        * 取得实例的类型。"所有对象都是Object的子类"这句现在应该没有人说了。Class对象就不是的。不信试试if (this.getClass() instanceof Object)?
        */
       public final native Class<?> getClass();

       /**
        * 这里用于哈希表的KEY值使用。如果用equals方法比较两个对象相等的话,那用HashCode方法返回的值也必须一样。如果HashCode返回的值一样,却不一定代表两个对象相等。推荐作法,还是如果两个对象相等的话,HashCode应该要返回相同的值。
        * 记得有一次,在一个JDK5的BETA版本里,有两个不同的STRING竟然得出相同的HashCode值!真叫人汗颜,,只好叫人家换JDK去了。。正式版的JDK就没有这问题。
        * 这个方法很奇怪。
        * 奇怪的是:Object里的HashCode是本地方法!!返回的是在内部的地址!!(这个地址应该可以相应地转成内存地址)我们很经常地覆盖这个方法,调用的将是子类中的非本地方法。看来本地方法也可以被覆盖。
        */
       public native int hashCode();

       /**
        * 这个方法得满足自反性,对称性与传递性。
        * 默认的Object里的equals方法仅仅是在两个对象是同一对象的情况下才返回TRUE(不然Object里没有成员变量,除了地址外还可以比较什么呢?)
        * 记得看了一篇BLOG,里面说:因为Object的equals方法是比较两个对象的引用的,所以所有的对象(当时特别指出的是String对象)的equals也是比较对象的引用的。他/她/它忘了这个方法是可以被子类改写的。真是误人不浅啊。
        * 一般地,改了equals方法最好也更改hashCode方法。
        */
       public boolean equals(Object obj) {
         return (this == obj);
       }

       /**
        * 这个方法了也真是有病。放在Object对象里,可是却不一定能用。如果不实现Cloneable接口的话,还要抛异常。
        * 那不要做事就好了嘛,可是在前面又有一个native关键字,看来那个本地方法就是用来抛异常了。真是个奇怪的方法。
        */
       protected native Object clone() throws CloneNotSupportedException;

       /**
        * 默认地显示出类名和相应的16进制哈希码。
        */
       public String toString() {
         return getClass().getName() + "@" + Integer.toHexString(hashCode());
       }

       /**
        * 多线程中用的方法。唤醒一个等待本对象监听器的一个线程。一个对象监听器只能由一个线程所拥有,也只有拥有的线程能调用这个方法(不然又要抛异常了,唉。。)。
        * 一个线程拥有这个对象监听器有三个方法:
        * 1、执行对象内的同步实例方法
        * 2、执行一个以本对象监听器为锁的同方法体
        * 3、对于Class类型的对象,执行该类的同步静态方法。
        * 这个方法还是final & native的,还不让改。
        */
       public final native void notify();

       /**
        * 与notify方法差不多,不同的是它会唤醒多个线程来一起抢对象监听器。
        */
       public final native void notifyAll();

       /**
        * 该方法会让当前线程(这个线程也必须拥有本对象的监听器)进入等待,并且释放所有本对象的同步锁,但不会释放其他对象锁的。
        * 有以下四种情况该线程被唤醒:
        * 1、有线程对本对象调用notify方法,而本线程恰好被选中
        * 2、有线程对本对象调用了notifyAll方法。
        * 3、有线程打断了本线程。
        * 4、指定的时间用完了。或者如果指定的时间为0的话,这个线程就会一直等待。
        * 奇怪的是:一个线程也有可能“假醒”(spurious wakeup),即第5种情况醒来。现实中很少碰到,但程序中还是得判断一下为好。换言之,wait还是放入到循环中比较好。比如:
        *     synchronized (obj) {
        *       while (<条件不满足>)
        *          obj.wait(timeout);
        *      ... // 执行醒来后的动作
        *     }
      * 该方法也只能被用有本对象监听器的线程调用。
      * 又是一个final & native,看来很多锁的方法都是用本地方法实现的。可能是考虑性能因素吧。
        */
       public final native void wait(long timeout) throws InterruptedException;

       /**
        * 与wait(long timeout)一样,只是加了一个纳秒(nanos)。可是从代码中看来,这个纳秒几乎没什么用:如果越界(<0 &#124;&#124; >999999)当然抛异常,如果大于500000,则TIMEOUT上加上一秒,如果TIMEOUT本身为0,而纳秒不为0的话就加上一秒。否则对纳秒视而不见。
        * 这样的方法除了会抛异常外,似乎也没干啥事,几乎没用。不过可以理解的是,JAVA本来就慢,你要精确到纳秒?没门!
        */
       public final void wait(long timeout, int nanos) throws InterruptedException {
           if (timeout < 0) {
               throw new IllegalArgumentException("timeout value is negative");
           }

           if (nanos < 0 &#124;&#124; nanos > 999999) {
               throw new IllegalArgumentException(
           "nanosecond timeout value out of range");
           }

       if (nanos >= 500000 &#124;&#124; (nanos != 0 && timeout == 0)) {
           timeout++;
       }
  
       wait(timeout);
       }

       /**
        * 不多说了。。
        */
       public final void wait() throws InterruptedException {
         wait(0);
       }

       /**
        * 在JVM的垃圾回收器要把该对象回收时会调用且仅调用一次这个方法。如果出现异常的话,那这个回收的过程就会中断。
        * 这算是个比较正常的方法定义,方法体是空的,可以由子类来填。
        * 有看到其他人在这个finalize方法里把一些引用置空,不知道这个效果如何?知道的吱一声。
        * 现在的垃圾回收器的机制已经很完善了,不会单纯只用引用计数器来回收对象。谁有使用过finalize方法,且让性能提高的请出来说一下。
        */
       protected void finalize() throws Throwable { }
}
 

 

分享到:
评论

相关推荐

    详解Java中Object 类的使用.rar

    这个压缩包文件"详解Java中Object 类的使用.rar"包含了对Java中Object类的深入探讨,通过阅读其中的"详解Java中Object 类的使用.txt"文本,我们可以了解到关于Object类的一些关键知识点。 1. **对象的创建与类型...

    Object-C语言详解(文档)

    Object-C语言详解(文档) 仅供学习交流! 后续会持续分享相关资源,记得关注哦! Object-C语言详解(文档) 仅供学习交流! 后续会持续分享相关资源,记得关注哦! Object-C语言详解(文档) 仅供学习交流! ...

    Object类和Scanner类

    #### 一、Object类详解 **1.1 概述** 在Java语言中,`Object` 类是所有类的基础。它位于类层次结构的顶端,这意味着所有的类,无论显式还是隐式地,都直接或间接地继承自 `Object` 类。这种设计确保了所有类都共享...

    day01【Object类、常用API】-笔记.md

    # Java核心知识点详解:Object类与常用API ## Object类概览 ### 1.1 概述 在Java编程语言中,`java.lang.Object`类具有非常特殊的地位,它是所有Java类的基类,即使程序员没有明确地指定某个类继承自`Object`类,...

    JavaScript知识点总结(十一)之js中的Object类详解

    3. **Object类主要方法** - `hasOwnProperty(propertyName)`: 这个方法用于检查对象是否直接拥有指定的属性,而不考虑原型链。它返回一个布尔值。例如,`obj.hasOwnProperty("name")`会检查`obj`对象是否有一个名为...

    Java Object类详解_动力节点Java学院整理

    所以,要想在ObjectTest类中调用clone()方法,你需要创建一个继承自Object的类,并在子类中调用clone()。这是Java中关于权限修饰符的一个重要概念。 Java Object类是所有Java类的根,它定义了一些基本的方法,这些...

    java-object类

    ### Java Object 类详解 #### 一、概述 `Object` 类是 Java 语言中最基础的类,位于 `java.lang` 包中。它是所有 Java 类的超类,即使程序员在定义一个新类时未明确指定该类继承自任何类,默认情况下,这个类也将...

    flash object标签 属性详解

    ### Flash Object标签及其属性详解 在HTML中嵌入Flash内容是一项常见的需求,尤其是在早期Web开发中。`&lt;object&gt;`标签是实现这一目标的关键工具之一。本文将深入探讨使用`&lt;object&gt;`标签及其相关属性来嵌入Flash内容...

    Unity3D Webplayer UnityObject 详解2

    ### Unity3D Webplayer UnityObject 详解 #### UnityObject简介 UnityObject 是一款JavaScript脚本,主要用于简化Unity的内容嵌入到HTML中。该脚本具备检测Unity网络播放器插件的功能,并能初始化网络播放器的安装...

    java中关键字Object详解

    Java中的`Object`类是所有类的根,这意味着无论你定义的任何自定义类,如果没有显式地声明继承自其他类,那么它们都会隐式地继承`Object`类。`Object`类提供了基本的方法,这些方法是所有Java对象共有的。下面我们将...

    Java Object类的常用方法详解与应用实践

    Object类的方法是Java编程的基础,它们为所有对象提供了基本的行为。掌握这些方法的用法和最佳实践,可以帮助我们编写出更加健壮、高效和可维护的Java代码。通过重写equals、hashCode和toString方法,我们可以确保...

    java包装类集合类详解

    ### Java包装类与集合类详解 #### 包装类概述 在Java中,为了更好地处理基本数据类型(如`int`、`double`等),Java提供了八种包装类,每种包装类都将基本数据类型“封装”起来,使得基本类型也能拥有对象特性,并...

    Object-C语言详解《word文档》

    Object-C语言详解《word文档》 Object-C语言详解《word文档》 仅供学习交流! 后续会持续分享相关资源,记得关注哦!

    Object arx 类天正墙体 的 自定义实体

    《Object ARX 类天正墙体的自定义实体详解》 Object ARX,全称为AutoCAD Object Application Programming Interface,是Autodesk公司为开发基于AutoCAD的应用程序提供的一种编程接口。通过Object ARX,开发者可以...

    Java软件开发实战 Java基础与案例开发详解 6-2 object类 共7页.pdf

    这意味着每一个自定义的类(除非明确指定继承其他类)都将隐式地继承自`Object`类。`Object`类提供了一些核心方法,这些方法对于Java应用程序来说至关重要。 ### 重要方法详解 #### 1. `toString()` 方法 `...

    Object-c 基础详解.docx

    ### Object-C 基础详解 #### 方法传参机制 在Object-C中,方法的参数传递遵循特定的规则。理解这些规则对于编写高效且安全的代码至关重要。 - **基本类型(值传递)**:例如`int`等基本数据类型,在传递时会创建...

    sqlhelper类详解

    ### SQLHelper 类详解 #### 一、概述 在.NET框架中,经常需要与数据库进行交互以实现数据存储、检索等功能。对于频繁的操作,手动编写连接、执行语句、关闭连接等代码不仅繁琐而且容易出错。为了提高开发效率并...

    常用类及方法详解.docx

    Java 常用类及方法详解 在Java编程语言中,有一些基础且常用的类和方法,对于初学者和长期未接触Java的开发者来说,熟悉这些基本元素是至关重要的。本篇文档将对其中的一些关键类,如Object、String、StringBuffer...

    ActiveObject 对象 Msxml2.DOMDocument 详解

    3. **documentElement**:返回XML文档的根元素。对于每个XML文档,都有且仅有一个根元素。 4. **selectNodes()** 和 **selectSingleNode()**:这两个方法用于根据XPath表达式选取节点。XPath是定位XML文档中节点的...

Global site tag (gtag.js) - Google Analytics