1 Object
1)java的类默认继承于Object! -> 啥都是东西
继承了Object的属性和方法
如:toString, hashCode(), equals()
2)关于toString 方法
toString()方法是在Object定义的,Java API经常默认调用这个方法输出对象的文本描述
如:println(obj)方法在输出对象时,默认调用obj.toString()作为输出结果
Object的toString()方法返回的是"全限定名@hashCode"
其中:全限定名= package +calssName
hashCode =对象内存地址经过算法换算成的一个整数,不是地址!
java 建议覆盖这个方法!覆盖为"合理的对象文本描述"
例子
1 public class ObjectDemo { 2 public static void main(String[] args) { 3 Object p = new Point(); 4 System.out.println(p.toString()); 5 System.out.println(p); 6 } 7 } 8 class Point /*extends Object*/{ 9 int x; 10 int y; 11 public String toString(){ //覆盖Object的toString() 12 return "("+x+","+y+")"; 13 } 14 }
输出结果
(0,0)
(0,0)
3) equals是用来比较两个对象是否相等的方法。
区别:引用相等 与 对象相等
引用值相等:使用"==",比较引用相当于比较对象的物理位置使用一致
不能用来比较对象,不能比较逻辑上对象是否相等
对象的内容相等:.equals()方法
equals在Object类中声明,默认比较的规则是:比较引用的值(就是==)
equals()的默认实现不是很好,建议覆盖!
覆盖为合理的对象相等逻辑:根据关键属性比较是否相等
例子
1 import java.util.Arrays; 2 3 public class EqualsDemo { 4 public static void main(String[] args) { 5 Node n1 = new Node(8,8); 6 Node n2 = new Node(8,8); 7 System.out.println(n1==n2);//false ==比较变量的地址值,是对象内存地址值 8 System.out.println(n1.equals(n2));//true 覆盖了equals()方法 9 10 Node[] nodes = {new Node(1,1), new Node(3,3)}; 11 Node[] others = {new Node(1,1), new Node(3,3)}; 12 //Arrays.equals会默认调用每一个对象元素中的equals方法 13 System.out.println(Arrays.equals(nodes, others));//true 14 } 15 16 } 17 18 class Node{ 19 int i,j; 20 public Node(int i,int j){ 21 this.i = i; 22 this.j = j; 23 } 24 public boolean equals(Object obj){ 25 if(obj==null){ //判断obj是否为空 26 return false; 27 } 28 if(this == obj){ //判断是否是同一个引用 29 return true; 30 } 31 if(obj instanceof Node){//判断obj是否是Node的一个实例 32 Node other = (Node)obj; 33 return this.i == other.i && this.j == other.j; 34 } 35 return false; 36 } 37 }
输出结果:
false
true
true
注意:当equals()方法被重写时,通常有必要重写hashCode方法
4)hashCode()方法
* 应该与equals() 方法一同覆盖,保证:
* 当两个对象相等时返回同一个整数,
* 两个对象不同时,返回尽可能不同的整数。
* 这个方法不是来比较对象是否相等的,是用于"散列表技术"(请参考集合章节)
例子:补充在上述例子中的代码
1 public int hashCode(){ 2 return i*1000+j; //为了满足以上随便写的算法 3 }
注:Java API基本都是覆盖了toString() equals() hashCode()