// 说明:A默认继承Object类,并且可以重写父类的toString方法
class A {
public String toString() {
return "哈哈";
}
}
public class TestObject {
public static void main(String[] args) {
A aa = new A();
System.out.printf("%s\n", aa.toString); // => 哈哈
}
}
如果不重写Object的toString方法,则输出结果是A@279f2327
,重写了toString方法之后,就是出你重写的信息。
class Dian {
public int x, y;
public Dian(int x, int y) {
this.x = x;
this.y = y;
}
public String toString() {
return "[" + x + "," + y + "]"; // => [1, 2]
}
}
public class TestPoint {
public static void main(String[] args) {
Dian d = new Dian(1, 2);
System.out.printf("%s\n", d); // => [1, 2];
}
}
这两个例子说明了两个问题:1、类默认继承Object类 2、重写父类的toString方法是为了方便打印对象的信息
toString方法总结
- 所有的类都默认自动继承了Object类
- Object类中的toString方法返回的是类的名字和该对象哈希码组成的一个字符串
- System.out.println(类对象名);实际输出的是该对象的toString()方法所返回的字符串
- 为了实际需要,建议子类重写从父类Object继承的toString方法
// 这个例子说明:equals这个方法判断的是两个对象的地址是否相等,相等返回true,否则返回false
class A {
public int i;
public A(int i) {
this.i = i;
}
}
public class TestStringEquals {
public static void main(String[] args) {
A aa1 = new A(2);
A aa2 = new A(2);
System.out.println( aa1.equals(aa2) ); // => false
if (aa1 == aa2)
System.out.println("aa1 和 aa2相等\n");
else
System.out.println("aa1 和 aa2不相等\n"); // 输出这个
System.out.println(aa1); // A@fd23sa
System.out.println(aa2); // A@ea34f2
}
}
但是我们都很明白一个道理,就拿上面的例子aa1 和 aa2这两个对象只有地址不一样,其他内容都是一样的,我们期望的就是他们是相等的,但是equals判断的就是两个对象的地址,而不管他们内容如何,所有我们想通过重写父类equals方法,来达到我们的期望。
// 这个例子说明:fa
class A {
public int i;
public A(int i) {
this.i = i;
}
public boolean equals(Object obj) {
A aa = (A)obj; // 因为父类无法调用子类特有的成员,所有obj.i会出错,
// 为了访问子类的特有成员,所以我们要把父类对象强制转换成子类对象
if (this.i == aa.j)
return true;
else
return false;
}
}
public class TestStringEquals {
public static void main(String[] args) {
A aa1 = new A(2);
A aa2 = new A(2);
System.out.println( aa1.equals(aa2) ); // => true
}
}
Object类的equals方法
- 所有类都从Object类中继承了equals方法
- Object类中equals方法源码如下:
public boolean equals(Object obj) {
return this == obj;
}
- Object中的equals方法是直接判断this和obj本身的值是否相等,即用来判断调用equals的对象和形参obj所引用的对象是否是同一对象,所谓同一对象就是指内存中同一块存储单元,如果this和obj指向的不是同一块内存,则返回false。注意:即便是内容全相等的两块不同的内存对象,也会返回false
- 如果是同一块内存,则Object中的equals方法返回true,如果是不同的内存,则返回false
何时需要重写equals方法
- 用一个类构造出来的不同内存的两个对象,如果内存中的值相等,我们一般情况下也应该认为这两个对象相等,很明显Object中的equals()无法完成这样的重任,Object中的equals()方法只有在两个对象是同一块内存时,才返回true,这时候我们就有必要重写父类Object中的equals方法
- 如果希望不同内存但相同内容的两个对象equals时返回true,则我们需要重写父类的equals方法