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 || >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 || nanos > 999999) { throw new IllegalArgumentException( "nanosecond timeout value out of range"); } if (nanos >= 500000 || (nanos != 0 && timeout == 0)) { timeout++; } wait(timeout); } /** * 不多说了。。 */ public final void wait() throws InterruptedException { wait(0); } /** * 在JVM的垃圾回收器要把该对象回收时会调用且仅调用一次这个方法。如果出现异常的话,那这个回收的过程就会中断。 * 这算是个比较正常的方法定义,方法体是空的,可以由子类来填。 * 有看到其他人在这个finalize方法里把一些引用置空,不知道这个效果如何?知道的吱一声。 * 现在的垃圾回收器的机制已经很完善了,不会单纯只用引用计数器来回收对象。谁有使用过finalize方法,且让性能提高的请出来说一下。 */ protected void finalize() throws Throwable { } }
发表评论
-
abbot_llib
2013-06-28 08:30 0abbot_llibabbot_llibabbot_lliba ... -
abbot_release
2013-06-28 08:12 314abbot_releaseabbot_releaseabb ... -
xmlAnalyzer
2013-06-17 02:41 557java xmlAnalyzer java xmlAna ... -
String StringBuffer StringBuilder区别
2013-02-23 09:57 7411. String 类 String 类是属于不可变 ... -
StringBuilder 详解
2013-02-23 09:50 1034Java中java.lang.StringBuilde ... -
System.nano()详解
2013-02-19 09:34 1435System.nanoTime只能用于计算时间差,不能用于 ... -
import satatic 详解
2013-01-24 10:46 673静态导入是JDK1.5中的新特性。 一般我们导入 ... -
Class000-Java体系
2012-11-22 01:02 442JAVA知识体系 j2se 1.Java ... -
Object类详解二
2012-11-22 00:49 531构造方法摘要 Object() ... -
Object类详解一
2012-11-22 00:48 460package java.lang; public c ... -
访问控制符
2012-11-19 22:10 0访问控制符的作用 ... -
静态方法[继承-重写-隐藏]
2012-11-18 02:21 709静态方法可以通过二种形式来调用,一种是类名加方法名,另一种是类 ...
相关推荐
这个压缩包文件"详解Java中Object 类的使用.rar"包含了对Java中Object类的深入探讨,通过阅读其中的"详解Java中Object 类的使用.txt"文本,我们可以了解到关于Object类的一些关键知识点。 1. **对象的创建与类型...
Object-C语言详解(文档) 仅供学习交流! 后续会持续分享相关资源,记得关注哦! Object-C语言详解(文档) 仅供学习交流! 后续会持续分享相关资源,记得关注哦! Object-C语言详解(文档) 仅供学习交流! ...
#### 一、Object类详解 **1.1 概述** 在Java语言中,`Object` 类是所有类的基础。它位于类层次结构的顶端,这意味着所有的类,无论显式还是隐式地,都直接或间接地继承自 `Object` 类。这种设计确保了所有类都共享...
# Java核心知识点详解:Object类与常用API ## Object类概览 ### 1.1 概述 在Java编程语言中,`java.lang.Object`类具有非常特殊的地位,它是所有Java类的基类,即使程序员没有明确地指定某个类继承自`Object`类,...
3. **Object类主要方法** - `hasOwnProperty(propertyName)`: 这个方法用于检查对象是否直接拥有指定的属性,而不考虑原型链。它返回一个布尔值。例如,`obj.hasOwnProperty("name")`会检查`obj`对象是否有一个名为...
所以,要想在ObjectTest类中调用clone()方法,你需要创建一个继承自Object的类,并在子类中调用clone()。这是Java中关于权限修饰符的一个重要概念。 Java Object类是所有Java类的根,它定义了一些基本的方法,这些...
### Java Object 类详解 #### 一、概述 `Object` 类是 Java 语言中最基础的类,位于 `java.lang` 包中。它是所有 Java 类的超类,即使程序员在定义一个新类时未明确指定该类继承自任何类,默认情况下,这个类也将...
### Flash Object标签及其属性详解 在HTML中嵌入Flash内容是一项常见的需求,尤其是在早期Web开发中。`<object>`标签是实现这一目标的关键工具之一。本文将深入探讨使用`<object>`标签及其相关属性来嵌入Flash内容...
### Unity3D Webplayer UnityObject 详解 #### UnityObject简介 UnityObject 是一款JavaScript脚本,主要用于简化Unity的内容嵌入到HTML中。该脚本具备检测Unity网络播放器插件的功能,并能初始化网络播放器的安装...
Java中的`Object`类是所有类的根,这意味着无论你定义的任何自定义类,如果没有显式地声明继承自其他类,那么它们都会隐式地继承`Object`类。`Object`类提供了基本的方法,这些方法是所有Java对象共有的。下面我们将...
Object类的方法是Java编程的基础,它们为所有对象提供了基本的行为。掌握这些方法的用法和最佳实践,可以帮助我们编写出更加健壮、高效和可维护的Java代码。通过重写equals、hashCode和toString方法,我们可以确保...
### Java包装类与集合类详解 #### 包装类概述 在Java中,为了更好地处理基本数据类型(如`int`、`double`等),Java提供了八种包装类,每种包装类都将基本数据类型“封装”起来,使得基本类型也能拥有对象特性,并...
Object-C语言详解《word文档》 Object-C语言详解《word文档》 仅供学习交流! 后续会持续分享相关资源,记得关注哦!
《Object ARX 类天正墙体的自定义实体详解》 Object ARX,全称为AutoCAD Object Application Programming Interface,是Autodesk公司为开发基于AutoCAD的应用程序提供的一种编程接口。通过Object ARX,开发者可以...
这意味着每一个自定义的类(除非明确指定继承其他类)都将隐式地继承自`Object`类。`Object`类提供了一些核心方法,这些方法对于Java应用程序来说至关重要。 ### 重要方法详解 #### 1. `toString()` 方法 `...
### Object-C 基础详解 #### 方法传参机制 在Object-C中,方法的参数传递遵循特定的规则。理解这些规则对于编写高效且安全的代码至关重要。 - **基本类型(值传递)**:例如`int`等基本数据类型,在传递时会创建...
### SQLHelper 类详解 #### 一、概述 在.NET框架中,经常需要与数据库进行交互以实现数据存储、检索等功能。对于频繁的操作,手动编写连接、执行语句、关闭连接等代码不仅繁琐而且容易出错。为了提高开发效率并...
Java 常用类及方法详解 在Java编程语言中,有一些基础且常用的类和方法,对于初学者和长期未接触Java的开发者来说,熟悉这些基本元素是至关重要的。本篇文档将对其中的一些关键类,如Object、String、StringBuffer...
3. **documentElement**:返回XML文档的根元素。对于每个XML文档,都有且仅有一个根元素。 4. **selectNodes()** 和 **selectSingleNode()**:这两个方法用于根据XPath表达式选取节点。XPath是定位XML文档中节点的...