Java核心API -- 1(Object类)


 

1. Object类
java

    在Java体系中,java.lang.Object类位于顶端(是全部对象的直接或间接父类)。若是一个类没有写extends关键字声明其父类,则该类默认继承java.lang.Object类。Object类定义了“对象”的基本行为,被子类默认继承。算法

    1)toString方法:返回一个能够表示该对象属性内容的字符串。安全

            MyObject obj=new MyObject();    // MyObject类自定义eclipse

            String info=obj.toString();     ide

            System.out.println(info);工具

        A.上例MyObject 类没有toString方法,对象也能调用toString()?性能

            由于全部的类都继承自Object,而toString方法是Ojbect定义的,咱们直接继承了这个方法。Object的toString方法帮咱们返回一个字符串,这个字符串的格式是固定的:类型@hashcode,这个hashcode是一串数字,在java中叫句柄,或叫地址(但不是真实的物理地址,是java本身的一套虚拟地址,防止直接操做内存的)。this

            public String toString(){    //只能用public,重写的方法访问权限要大于等于父类中方法的权限编码

                return "这个是咱们本身定义的toString方法的返回值MyObject!";    spa

            }

        B.为何要重写toString方法?

            toString定义的原意是返回可以描述当前这个类的实例的一串文字,咱们看一串hashcode没意义,因此是要重写的。


    2)equals方法:用于对象的“相等”逻辑。

        A.在Object中的定义: 

            public  boolean  equals(Object obj){  

                return (this==obj);  

            }

            因而可知,this==obj与直接的==(双等于)效果同样,仅仅是根据对象的地址(句柄,那个hashcode值)来判断对象是否相等。所以想比较对象与给定对象内容是否一致,则必须重写equals方法。

        B.“==”与equals的区别:

            用“==”比较对象时,描述的是两个对象是否为同一个对象!根据地址值判断。而equals方法力图去描述两个对象的内容是否相等,内容相等取决于业务逻辑须要,能够自行定义比较规则。

        C.equals方法的重写:如,判断两点是否相等。

             public boolean equals(Object obj){

                 /* 注意参数,若给定的对象obj的地址和当前对象地址一致,那么他们是同一个对象,

                  * equals方法中有大量的内容比较逻辑时,加上这个判断会节省性能的开销!

                  */

                if(this == obj){

                    return true;

                }

                 /* equals比较前要进行安全验证,确保给定的对象不是null!若obj是null,

                  * 说明该引用变量没有指向任何对象,那么就不能引用ojb所指象的对象(由于对象不存在)

                  * 的属性和方法!若这么作就会引起NullPointException,空指针异常!

                  */

                if(obj == null){

                    return false;

                }

                 /* 直接将Object转为子类是存在风险的!咱们不能保证Object和咱们要比较的对象是

                  * 同一个类型的这会引起ClassCastException!咱们称为:类造型异常。

                  * 重写equals时第一件要作的事情就是判断给定的对象是否和当前对象为同一个类型,

                  * 不是同类型直接返回false,由于不具有可比性!

                  */

                if( !(obj instanceof Point) ){

                    return false;

                }

                // 是同一类型,转换

                Point p=(Point)obj;

                // 最后返回内容比较( 根据实际状况决定 ) 

                return this.x==p.x && this.y==p.y;   

            }

    3)hashCode()方法(如下这段话是从别人帖子回复拷贝过来的)

        hashcode是用来查找的,例如内存中有这样的位置: 0  1  2  3  4  5  6  7,而我有个类,这个类有个字段叫ID,我要把这个类存放在以上8个位置之一,若是不用hashcode而任意存放,那么当查找时就须要到这八个位置里挨个去找,或者用二分法一类的算法。但若是用hashcode那就会使效率提升不少。咱们这个类中有个字段叫ID,那么咱们就定义咱们的hashcode为ID%8,而后把咱们的类存放在取得得余数那个位置。好比咱们的ID为9,9除8的余数为1,那么咱们就把该类存在1这个位置,若是ID是13,求得的余数是5,那么咱们就把该类放在5这个位置。这样,之后在查找该类时就能够经过ID除 8求余数直接找到存放的位置了。 

        可是若是两个类有相同的hashcode怎么办那(咱们假设上面的类的ID不是惟一的),例如9除以8和17除以8的余数都是1,那么这是否是合法的,回答是:能够这样。那么如何判断呢?在这个时候就须要定义 equals了。也就是说,咱们先经过 hashcode来判断两个类是否存放某个桶里,但这个桶里可能有不少类,那么咱们就须要再经过 equals 来在这个桶里找到咱们要的类。   

        那么。重写了equals(),为何还要重写hashCode()呢?   想一想,你要在一个桶里找东西,你必须先要找到这个桶啊,你不经过重写hashcode()来找到桶,光重写equals()有什么用啊。

    4)编码时候,能够采用eclipse快捷工具生成对应的equals()和hashCode()方法。

相关文章
相关标签/搜索