Java基础 重写toString和equals方法

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

一、重写toString方法
1、java库中的源代码:
public String toString(){
    return this.getClass().getName()+"@"+Integer.toHexString(hashCode());
}
源代码默认实现的是:类名@十六进制的对象的内存地址。
2toString()方法的设计目的是通过调用这个方法可以将“一个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即可选择想要重写的方法
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值