Object类中的toString和equal方法

      Object类是一个特殊的类,是所有类的最高层,是所有类的超类。当一个类没有指定父类时,会默认继承Object类。

      换句话说,所有的类都是由Object类衍生出来的,Object类中的方法适用于所有的类。这里简要的介绍几个方法。



------------------------------

      首先来说toString方法,在打印对象时,会调用toString方法。比如说:

Car car = new Car();
System.out.println(car);//这里直接打印一个对象,其本质是调用这个对象中的toString()方法。

      这里定义一个Car类的对象,然后直接打印这个对象,在打印的时候,会直接调用toString方法,等同于下列代码段:

Car car=new Car();
System.out.println(car.toString);//这里直接打印一个对象,其本质是调用这个对象中的toString()方法。

      如果在Car类定义的时候没有重写toString()方法,那么会默认调用Object中的方法,而Object中的toString方法的串组成形式如下:

"getClass().getName()  +  "@"  +  Integer.toHexString(hashCode())"

      所以,想要打印如符合自己心意的字符串时,必须要重写toString方法。



------------------------------

      再来说一下equal方法,它也是Object中的一个方法。

      一般当人们使用equal方法时,偏向于用来判定两个对象的值,或者是两个对象的内容是不是相同。但是Object内置的equal方法是直接使用“==”来实现的,用“==”比较的是内存地址,而不是内存中存放的内容。返回的是布尔值true或者是false。

      所以,一般想要使用equal方法来比较对象的值的时候,一定要重写equal方法。

      关于equal方法的重写问题,我们来看一个例子:

public class Person {

	private String name;
	private int age;
	
	public Person(String name, int age) {
		this.name = name;
		this.age = age;
	}

	@Override
	public boolean equals(Object obj) {
		Person p1 = this;
		if(obj instanceof Person){
			Person p2 = (Person) obj;
			if(p1.name.equals(p2.name) && p1.age == p2.age){
				return true;
			}
			else return false;
		}
		else{
			return false;
		}
	}
}
       这个Person类,定义了两个成员变量,分别是姓名和年龄,当我们想要比较两个Person对象的时候,一般是要比较两个对象中的某些成员变量是否相同,一般不会去比较两个对象的地址是不是相同,所以此时,重写的equal方法就很有意义。这重写的这个equal方法中,形参是一个Object对象,在内部判断传入对象为Person类之后,可以进一步进行对比。

       对比的过程中使用了if语句,这个if语句中,因为String是一个类,可以使用String类中的equal方法,(注意,String类中的equal方法已经在String类内部重写重写)而p1.age和p2.age是一个int的数据类型,直接使用“==”来判断即可,或者是把两个int数据类型采用包装类,包装成Integer类以后也可以使用equal方法。

       将这个方法重写之后,可以进行一个测试,测试程序如下:

public class CoverEquals {
	
	static Person p1 = new Person("zhangsan",18);
	static Person p2 = new Person("zhangsan",18);
	static Person p3 = new Person("lisi",20);	
	
	public static void main(String[] args) {
		if(p1.equals(p2)){
			System.out.println("p1 is equal with p2");
		}
		else{
			System.out.println("p1 is not equal with p2");
		}
		
		if(p1 == p2){
			System.out.println("p1 is '=' with p2");
		}
		else{
			System.out.println("p1 is not '=' with p2");
		}
	
		if(p1.equals(p3)){
			System.out.println("p1 is equal with p3");
		}
		else{
			System.out.println("p1 is not equal with p3");
		}
	}
}
      得到测试结果如下:

      p1 is equal with p2
      p1 is not '=' with p2
      p1 is not equal with p3


不过,为了保证可能使用到的容器HashSet或者HashMap,甚至是HashTable的准确性,一般需要在重写equals方法的同时,重写hashCode方法。举个例子,在类Account下重写hashCode方法和equals方法的代码段如下:

public class Account
{
	// 封装账户编号、账户余额两个Field
	private String accountNo;
	private double balance;
	
	// 下面两个方法根据accountNo来重写hashCode()和equals()方法
	public int hashCode()
	{
		return accountNo.hashCode();
	}
	public boolean equals(Object obj)
	{
		if(this == obj)
			return true;
		if (obj !=null
			&& obj.getClass() == Account.class)
		{
			Account target = (Account)obj;
			return target.getAccountNo().equals(accountNo);
		}
		return false;
	}
}



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值