Object类中的toString和equal方法

来源:互联网 发布:java实验指导书答案 编辑:程序博客网 时间:2024/04/19 12:14

      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;}@Overridepublic 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{// 封装账户编号、账户余额两个Fieldprivate 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 1
原创粉丝点击