之所以专门重写这两种方法,说明这两种方法的重要性,相对来说equals方法更为重要,虽然在一些编译器应该都可以自动实现,但是掌握这种方两法还是很有必要的。


一、重写toString方法

1、java库中的源代码:

public String toString(){

    return this.getClass().getName()+"@"+Integer.toHexString(hashCode());

}

源代码默认实现的是:类名@十六进制的对象的内存地址。

2、toString()方法的设计目的是通过调用这个方法可以将“一个java对象”装换成“字符串”


二、重写equals方法

1、java库中equals方法的源代码:

public boolean equals(Object obj){

    return(this==obj);

}

2、equals方法2、用来判断两个对象是否相等。

3、Object类中的equals方法当中,默认采用“==”判断两个java对象是否相等。而“==”判断的是两个java对象的内存地址,我们要判断的是两个java对象中的内容是否相等。需要子类重写equals。

以下是代码举例过程

public class FifthTest11 {

    public static void main(String[] args) {

        MyTime myTime=new MyTime(1970,1,1);

        String s1=myTime.toString();

        //MyTime类的toString方法重写之前

        //System.out.println(s1);//MyTime@1b6d3586

        //MyTime类的toString方法重写之后

        System.out.println(s1);//MyTime{year=1970, month=1, day=1}

    }

}


public class FifthTest13 {

    public static void main(String[] args) {

        //判断两个基本数据类型的数据是否相等直接使用“==”即可

        int a=100;

        int b=100;

        //“==”判断a中保存的100和b中保存的100是否相等

        System.out.println(a==b);//true

        //创建四个日期对象

        MyTime t1=new MyTime(2000,8,8);

        MyTime t2=new MyTime(2000,8,8);

        MyTime t3=new MyTime(2000,8,9);

        MyTime t4=null;

        //测试判断两个java对象是否相等时是否可以使用“==”

        //实际上经过测试和逻辑推理可知该“==”是比较t1和t2保存对象的内存地址是否相等

        System.out.println(t1==t2);//false

        //重写equals方法之前比较的还是两者之间的内存地址

        //boolean flag=t1.equals(t2);

        //System.out.println(flag);//false

        //重写equals方法之后比较的是对象的内容,符合我们的预期

        boolean flag=t1.equals(t2);

        System.out.println(flag);//true

        System.out.println(t1.equals(t3));//false

        System.out.println(t1.equals(t4));//false

    }

}


创建MyTime类

public class MyTime {

    int year;

    int month;

    int day;

    //无参构造

    public MyTime() {

    }


    //有参构造

    public MyTime(int year,int month,int day) {

        this.year = year;

        this.month=month;

        this.day=day;

    }


    //重写toString方法,要求简洁,可读性高即可

    public String toString() {

        return "MyTime{" + "year=" + year + ", month=" + month + ", day=" + day + '}';

    }

   //重写equals方法    

   public boolean equals(Object obj) {

          //如果obj为空,直接返回false

          if (obj == null) {

              return false;

          }

          //如果obj不是一个MyTime类型数据,不再进行比较,直接返回false

          if (!(obj instanceof MyTime)) {

              return false;

          }

          //如果this和obj保存的内存地址相同,不再进行比较,直接返回true

          //内训地址相同,两者指向的堆内存对象肯定是同一个

          if (this == obj) {

              return true;

          }

          //程序执行到此处,说明obj不是空,且obj是MyTime类型,那么就直接对内容进行比较

          MyTime t = (MyTime) obj;

          return this.year == t.year && this.month == t.month && this.day == t.day;

      }

}


两个方法的重写在部分编译器的快捷键已经实现,例如在IDEA中按alt+insert即可选择想要重写的方法