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
- java API——引用类型对象对Object的继承及源码分析
- Java源码——对象序列化(对象的存储及读取)(Object Serialization)
- 对js中的引用类型的理解(2)——Object类型
- 对java对象的地址引用及值引用
- 对Java中引用、对象、基本类型等的理解
- 继承object对象对python多继承的影响
- JAVA 【引用类型】和【对象类型】在【继承】中的异同
- java对象的引用类型
- java对象引用的类型
- JavaScript引用类型——Object类型
- redis object对象系统的源码分析
- 引用类型——object类型({'name':'Nicholas'},对象字面常量)
- java的对象祖先Object的源码
- JS引用类型——Object
- 浅谈JavaScript引用类型——Object
- java中对象的引用类型及判断对象是否存活的算法
- java.lang之java.lang.Object源码阅读及分析
- javascript引用类型之对象Object
- HDU 2048 (dp46)
- Java中的文件和流相关知识
- 文件系统中数据读取的详细过程
- 《实战Java...》读书笔记2
- LeetCode 23. Merge k Sorted Lists
- java API——引用类型对象对Object的继承及源码分析
- HDU 1203(dp46)
- [JAVA]从链表中删除重复数据(时间、空间)
- 小P的强力值
- HDOJ 1166 敌兵布阵(树状数组)
- HDU 2159(dp46)
- php中的trait
- Java 常量和变量
- C Primer Plus(第五版)中文版第11章编程练习(部分使用新特性,在codeblocks下通过测试,vc++6下运行可能出现错误)