java API——引用类型对象对Object的继承及源码分析

来源:互联网 发布:淘宝店模板收费吗 编辑:程序博客网 时间:2024/05/21 19:34

一、’引用数据类型

除了上篇博客介绍的四类八种的基本数据类型之外,其他的数据类型及对象都是引用类型。比如我们new的一个类就是引用类型。

二、为什么引用数据类型需要重写toString、hashCode、equals方法

(1)引用类型的内存分析为什么重写equals

大家都知道,我们new一个对象的时候(能new的都是引用类型),首先内存中先分配一个为null的地址,当给对象赋值的时候会再有一块儿内存存放值,而先前为null的地址指向赋的值,听起来比较拗口,请看下图:

1)new一个新的类

     Integer in = new Integer();

        

2)赋值

<span style="white-space:pre"></span>in = 1;


    而现在==比较的是in1的值即比较的地址,而不是1。所以当我们new两个Integer对象,尽管他们的值都是1,但是他们不是一个对象,在内存中的地址也是不一样的,如下图:

如如比较的是in1和ni1。写个实例如代码:
class Equslstest{int color,height,weight;public Equslstest(int color,int height,int weight){this.color = color;this.height = height;this.weight = weight;}}public  void testEquls() {Equslstest c1= new Equslstest(1,2,3);Equslstest c2= new Equslstest(1,2,3);System.out.println(equslstest1 == equslstest2);}

结果返回false。若将==换成equals结果也返回false,因为Object底层是==实现的,故需要重写equals,如下代码;
class Equslstest{int color,height,weight;public Equslstest(int color,int height,int weight){this.color = color;this.height = height;this.weight = weight;}public boolean equals(Object obj) {if(obj == null){return false;}else{if(obj instanceof Equslstest){Equslstest c = (Equslstest)obj;if(c.color == this.color && c.height == this.height && c.weight == this.weight){return true;}}}return false;}}

结果返回true。所以要重写quals。
(2)为什么重toString,先看如下例子:
public  void testTostring() {sss d = new sss();System.out.println(d);}class sss{}
返回结果:com.bjpowernode.hibernate.sss@6225352b。因为sss继承自Object类,而object的toString方法上篇博文已介绍,所以需要重写返回正确的值,如下图:
class sss{public String toString(){return "I am Aldeo!";}}
 返回结果为:I am Aldeo!
(3)为什么重写hashCode
官方规定,重写equals方法就重写hashCode方法,保证如果两个对象的值是一致的那么每次启动的hashCode的值是一致的。所以需要重写。这样对系统来说是比较合理的。
三、java底层引用类型数据重写Object的源码分析
        以String为例
(1)equals
public boolean equals(Object anObject) {        if (this == anObject) {            return true;        }        if (anObject instanceof String) {            String anotherString = (String) anObject;            int n = value.length;            if (n == anotherString.value.length) {                char v1[] = value;                char v2[] = anotherString.value;                int i = 0;                while (n-- != 0) {                    if (v1[i] != v2[i])                            return false;                    i++;                }                return true;            }        }        return false;    }

重写比较两个值。
(2)hashCode
 public int hashCode() {        int h = hash;        if (h == 0 && value.length > 0) {            char val[] = value;            for (int i = 0; i < value.length; i++) {                h = 31 * h + val[i];            }            hash = h;        }        return h;    }
根据值来算hashCode的值。

(3)重写toString
public String toString() {        return this;    }

返回传入的值。

0 0
原创粉丝点击