一、Object
java.lang.Object 是所有类的根类,每个 Java 对象都是一个 Object。本文主要说明的是 Object 类中的一组方法,这些方法是所有对象都需要的一些关键行为的默认实现。除非重写这些方法,否则都会直接继承自 Object 类。其中,Object 中的 wait、notify 和 notifyAll 方法是 Java 并发支持的一部分。
二、toString 方法
定义:是对象用来创建一个自我描述的字符串的方法。
任何一个对象都可以和一个字符串进行连接。
下面例子中的两个方法都为 Foo 类创建了新的实例并调用其 toString 方法。运行结果完全相同:
System.out.println( "This is a new foo: " + new Foo()); System.out.println( "this is a new foo: ".concat((new Foo()).toString()));
在 Object 类中,toString 方法的实现基于对象在堆中的位置,其返回一个没什么用的字符串。在代码中对 toString 方法重写是方便后期调试良好的开端。
我们可以在 eclipse 中的编辑器中 右键——源码——生成 toSting() 方便的进行重写如下图(我用的是中文版):关于汉化的方法,我会将链接放在文章的末尾。
三、finalize 方法:
该方法和 clone 方法一样都属于历史遗留,只有在子类中重写了 finalize 方法时,Java 才会在运行时调用该方法。
但是,当类显示定义了 finalize 方法时,对该类的对象执行垃圾回收时,会调用该方法。Java 不但无法保证什么时候会调用 finalize 方法,实际上,它甚至无法确保一定会调用这个方法。
此外,调用 finalize 方法可能会重新激活一个对象!!!原因:当一个对象不存在可用的引用时,Java 就会自动对它执行垃圾回收。但是,finalize 方法的实现会为这个对象“创建”一个新的可用的引用,例如把实现了 finalize 的对象加到某个列表中!由于这个原因,finalize 方法的实现阻碍了对所定义的类的很多优化。
综上所述,使用 finalize 方法,不会带来好处,却带来了一堆坏处,不建议使用!!!
四、clone 方法:
通过该方法可以不调用构造函数而直接创建对象。
虽然在 Object 类中定义了 clone 方法,但在一个对象中调用 clone 方法会导致一场,除非该对象实现了 Cloneable 接口。
如果我们创建一个对象的代价很高的时候,clone 方法可以成为一种有用的优化方式。虽然在某些特定的情况下,使用 clone 方法可能是必须的,但是通过复制构造函数(用已经有的实例作为其唯一的参数)显得更加的简单,而且很多情况下,这样的通过复制构造函数的代价是可以忽略的。如下所述:
Student stu1 = new Student(); Student stu2 = stu1;
同样不建议使用clone方法,如上所述,更多情况下,通过复制构造函数,可以解决大多数问题。
五、equals 方法:
通过这个方法和 hashCode 方法,调用者都可以知道一个对象是否和另一个对象相同。
equals 方法的实现必须具有以下4个特性,且相关声明必须始终为真:
自反性:x.equals(x)
对称性:x.equals(y)==y.equals(x)
传递性:(x.equals(y) && y.equals(z)) == x.equals(z)
一致性:如果 x.equals(y) 在程序生命周期的任意点都为真,只要 x 和 y 的值不变,则 x.equals(y) 就始终为真!
满足这4大特性,相当困难。常见错误之一是定义一个新的类(违反了自反性),在某些情况下等价于已有的类。
假设使用了已有的定义了类 EnglishWeekdays 的库,假设又定义了类 FrenchWeekdays。显然,我们很可能会为 FrenchWeekdays 类定义 equals 方法,该方法和 EnglishWeekdays 相应的 French 等值进行比较并且返回真。 但是!!!千万不要这么做,已有的 EnglishWeekdays 类看不到新定义的
FrenchWeekdays 类,因而它永远都无法确定你所定义的类的实例是否是等值的。因此这种方式违反了自反性!!!
六、hashCode方法
该方法和 equals 方法应该是成对出现的,只要重写了其中一个方法,另外一个也应该重写。
很多的库程序把 hashCode 方法作为判断两个对象是否等价的一种优化方式。
这些库首先比较两个对象的哈希码,如果这两个对象的哈希码不同,那么就没有必要执行代价更高的比较操作,因为这两个对象一定是不同的。
哈希码算法的特点在于计算非常快速,这方面可以很好的取代equals方法。
一方面访问大型数组的每个元素来计算其哈希码,很可能还比不上执行真正的比较操作,而另外一方面,通过哈希码计算可以非常快速的返回0值,只是可能不是非常有用。
所以在使用哈希码算法方面我们需要根据实际情况来考量。
本文参考自《Android程序设计》
引用说明:Programming Android by Zigurd Mednieks, Laird Dornin, G.Blake Meike, and Masumi Nakamura. Copyright 2011 O‘Reilly
Media, Inc., 978-1-449-38969-7