Object类详解

来源:互联网 发布:淘宝品牌 编辑:程序博客网 时间:2024/06/05 00:35
* Object类是所有类的父类,每个类都是由Object类扩展而来。如果没有明确指出父类,则默认为Object类为该类的父类。* 可以使用Object类型的变量引用任何类型的对象。* 在Java中,只有基本数据类型(数字,字符,布尔)不是对象。所有的数组类型,不管是对象数组还是基本类型的数组都扩展了Object类。 int[] i=new int[5]; Object obj=i;* equals()方法*     * 在Object类中,该方法用于判断两个对象是否具有相同的引用。    * 然而,经常需要检测两个对象的状态的相等性,所以一般需要覆写equals()方法。      public class Test{           public boolean equals(Object otherObject){                }       }*     * 在子类中定义equals方法时,首先调用父类的equals方法。如果检测失败,则对象不可能相等。如果父类中的域都相等,就需要比较子类中的实例域。  public class Test{           public boolean equals(Object otherObject){           if(!super.equals(otherObject)) return false;            //接着比较子类中扩展的实例域               }       }*     * Java规范要求equals方法具有下面的特性:    *         * 自反性:对于非空引用 x,x.equals(x)应该返回true.        * 对称性:如果x.equals(y)返回true,则y.equals(x)也应该返回true        * 传递性:x.equals(y)返回true,y.equals(z)返回true,则x.equals(z)返回true        * 一致性:如果x,y引用的对象没有发生改变,反复调用x.equals(y)返回相同的结果        * 对于非空引用x,x.equals(null)应该返回false.    * 编写equals方法的步骤:    *         * 显式参数命名为otherObject,稍后需将它转换成叫做other的变量        * 检测this与otherObject是否引用同一个对象                if(this==otherObject)  return true;*     *         * 检测otherObject是否为null,如果为null,则返回false                if(otherObject==null)  return false;*     *         * 比较this与otherObject是否属于同一个类                if(this.getClass!==otherObject.getClass)  return false;*     *         * 将otherObject转换为相应的类类型变量                ClassName other=(ClassName)otherObject*     *         * 对所有需要比较的域进行比较。使用==比较基本类型域,使用equals比较对象域。如果所有的域都匹配则返回true,否则返回false.                return field1==other.field&&objects.equals(field,other.field)* hashCode()方法*     * 散列码(hash code)是由对象导出的一个整型值(可以是负数)。散列码没有规律,两个不同对象的散列码基本不同。    * 在Object类中,hashCode()方法的返回值默认为对象的存储地址。    * String类型重写了hashCode()方法,字符串的散列码是由内容导出的。计算过程如下:           int hash=0;      for(int i=0;i<length();i++){           hash=31*hash+charAt(i);      }      //String str1="string";  String str2=new String("string");      //str1,str2的散列码值相同,因为其内容相同。*     * 如果重新定义equals()方法,就必须重新定义hashCode()方法,以便用户可以将对象插入到散列表中。equals()方法与hashCode()方法的定义必须一致:如果x.equals(y)返回true,那么x.hashCode()的值必须与y.hashCode()值相等。    * 如果存在数组类型的域,可以使用静态的Arrays.hashCode()方法计算一个散列码,这个散列码由数组元素的散列码组成。           static int hashCode(type[] a)//数组类型可以是任意类型* toString()方法*     * 该方法用于返回表示对象值的字符串。    * Object类中的toString()方法返回对象所属的类名及散列码。    * 只要将对象与一个字符串通过"+"相连,Java编译器就会自动调用toString()方法,以便获得这个对象的字符串表示。    * 大部分类覆写了toString()方法,返回值为:类的名字,随后是一对方括号括起来的域值。    * 数组类型继承了Object类的toString方法,如果直接输出数组,如:int[] arr={1,2,3};,会生成字符串:类型+hashCode。如果想要输出[1,2,3],则需调用Arrays.toString()方法。           static String toString(type[] a)            * getClass()方法*     * 返回此 Object 的运行时类。返回的 Class 对象是由所表示类的 static synchronized 方法锁定的对象* protected Object clone()*     * 创建并返回此对象的一个副本。“副本”的准确含义可能依赖于对象的类。这样做的目的是,对于任何对象 x,表达式: x.clone() != x 为 true,表达式: x.clone().getClass() == x.getClass()

也为 true,但这些并非必须要满足的要求。
* 一般情况下: x.clone().equals(x)为 true,但这并非必须要满足的要求。
* 按照惯例,返回的对象应该通过调用 super.clone 获得。如果一个类及其所有的超类(Object 除外)都遵守此约定,则 x.clone().getClass() == x.getClass()。
* 按照惯例,此方法返回的对象应该独立于该对象(正被复制的对象)。要获得此独立性,在 super.clone 返回对象之前,有必要对该对象的一个或多个字段进行修改。这通常意味着要复制包含正在被复制对象的内部“深层结构”的所有可变对象,并使用对副本的引用替换对这些对象的引用。如果一个类只包含基本字段或对不变对象的引用,那么通常不需要修改 super.clone 返回的对象中的字段。
* Object 类的 clone 方法执行特定的复制操作。首先,如果此对象的类不能实现接口 Cloneable,则会抛出 CloneNotSupportedException。注意,所有的数组都被视为实现接口 Cloneable。否则,此方法会创建此对象的类的一个新实例,并像通过分配那样,严格使用此对象相应字段的内容初始化该对象的所有字段;这些字段的内容没有被自我复制。所以,此方法执行的是该对象的“浅表复制”,而不“深层复制”操作。
* Object 类本身不实现接口 Cloneable,所以在类为 Object 的对象上调用 clone 方法将会导致在运行时抛出异常。

* public final void notify()*     * 唤醒在此对象监视器上等待的单个线程。如果所有线程都在此对象上等待,则会选择唤醒其中一个线程。选择是任意性的,并在对实现做出决定时发生。线程通过调用其中一个 wait 方法,在对象的监视器上等待。    * 直到当前线程放弃此对象上的锁定,才能继续执行被唤醒的线程。被唤醒的线程将以常规方式与在该对象上主动同步的其他所有线程进行竞争;例如,唤醒的线程在作为锁定此对象的下一个线程方面没有可靠的特权或劣势。    * 此方法只应由作为此对象监视器的所有者的线程来调用。通过以下三种方法之一,线程可以成为此对象监视器的所有者:    *         * 通过执行此对象的同步实例方法。        * 通过执行在此对象上进行同步的 synchronized 语句的正文。        * 对于 Class 类型的对象,可以通过执行该类的同步静态方法。    * 一次只能有一个线程拥有对象的监视器。* public final void wait(long timeout)*     * 此方法导致当前线程(称之为 T)将其自身放置在对象的等待集中,然后放弃此对象上的所有同步要求。出于线程调度目的,在发生以下四种情况之一前,线程 T 被禁用,且处于休眠状态:    *         * 其他某个线程调用此对象的 notify 方法,并且线程 T 碰巧被任选为被唤醒的线程。        * 其他某个线程调用此对象的 notifyAll 方法。        * 其他某个线程中断线程 T。        * 大约已经到达指定的实际时间。但是,如果 timeout 为零,则不考虑实际时间,在获得通知前该线程将一直等待。    * 然后,从对象的等待集中删除线程 T,并重新进行线程调度。然后,该线程以常规方式与其他线程竞争,以获得在该对象上同步的权利;一旦获得对该对象的控制权,该对象上的所有其同步声明都将被恢复到以前的状态,这就是调用 wait 方法时的情况。然后,线程 T 从 wait 方法的调用中返回。所以,从 wait 方法返回时,该对象和线程 T 的同步状态与调用 wait 方法时的情况完全相同* protected void finalize()*     * 当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。子类重写 finalize 方法,以配置系统资源或执行其他清除。
0 0
原创粉丝点击