您的位置:首页 > 移动开发 > Objective-C

Object类中的toString和equal方法

2015-03-08 22:29 711 查看
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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: