Android学习之——JAVA中的Object

一、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() 方便的进行重写如下图(我用的是中文版):关于汉化的方法,我会将链接放在文章的末尾。
              Android学习之——JAVA中的Object

三、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



Android学习之——JAVA中的Object,布布扣,bubuko.com

Android学习之——JAVA中的Object

上一篇:How to programmatically tell if a Bluetooth device is connected? (Android 2.2)


下一篇:android音乐播放器+异步加载+缓存+图片加载+listview列表显示+tomcat服务器+xml解析