Java学习 -- toString和equals

// 说明: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方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值