之所以专门重写这两种方法,说明这两种方法的重要性,相对来说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即可选择想要重写的方法