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

    xiaoxiao2025-06-03  24

    一、’引用数据类型

    除了上篇博客介绍的四类八种的基本数据类型之外,其他的数据类型及对象都是引用类型。比如我们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; } 返回传入的值。

    转载请注明原文地址: https://ju.6miu.com/read-1299568.html
    最新回复(0)