toString()、equals()是什么,为啥需要重写,多种方法来重写
创始人
2024-06-03 09:15:54

https://m.runoob.com/java/java-object-class.html

toString()

1.为什么会有toString

子类继承父类就可以使用父类所有非私有的属性的方法。
在Java中所有类都直接或者间接继承Object类,可以说只要是Object类里面定义的非私有的属性和方法,任何类都可以使用如toString(),equals(),hashCode(),notify()等等这些方法都是Object类已经定义好的的方法。

2.什么是toString

toString()就是把非字符串的数据类型转化为字符串。
Object类中的toString方法源码:


//(1)getClass().getName() 返回类的全类名(包名+类名)
//(2)Integer.toHexString(hashCode())将对象的hashCode值转成16进制字符串
public String toString() {return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

输出的结果是:包名.类名+@+16进制的哈希值

  • getClass().getName() 意思就是这个类的全路径类名,包含了包名和类名信息,
  • hashCode是将对象的地址转换成一个整数
  • **Integer.toHexString(hashCode())**就是将hashCode值转化为16进制

最后中间拼接一个@连起来就有了上面例子的com.xhy.show.Show@15db9742。
toString()方法会返回一个字符串。结果应是一个简明但易于读懂的信息表达式。建议所有子类都重写此方法

3.重写toString

由于 Object 类中的 toString() 方法并不好用,因此很多其他类中都重写了此方法。(子类对父类提供的方法不满意,所以重写以符合自己的需求)

在idea中,直接 Alt+Insert 选择toString()就能自动生成重写的roString()方法。

//重写toString方法,输出对象的属性@Overridepublic String toString() {   //重写后,默认一般是把对象的属性值输出return "Monster{" +"name='" + name + '\'' +", job='" + job + '\'' +", sal=" + sal +'}';

equals()

1.方法目的、源码

equals()也是Object中的方法,在object中equals是用来看看两个参数是否引用的是同一个对象

Object类中的equals()方法源码:

public boolean equals(Object obj) {return (this == obj);
}

2.重写equals()

但实际开发中经常比较的是两个对象的内容是否相等,因此需重写equals,注意只能是一个类里比。

(1)在idea中,直接 Alt+Insert 选择tequals()就能自动生成重写的equals()方法。

public boolean equals(Object obj){//判断地址是否相同//判断测试的是否是同一个对象//如果是同一个对象,毋庸置疑,它应该返回Trueif(this==obj){return true;}//非空性if(obj == null){return false;}//判断是否是一个类if(obj instanceof Person){//向下转型//将参数传入的对象造型为Citizen类型//object类是所有类的父类不向下转换,父类就比较不了子类的属性Person p=(Person) obj;if(this.name.equals(p.name)&&this.age==p.age){return true;}}return false;}

(2)自己手动定义编写
如只需role相同,或都为空不为空时的判断:
在这里插入图片描述
在这里插入图片描述

(3) 使用类里已经重写过的toString()方法的输出来比较:

@Override
public boolean equals(Object obj){if(obj instanceof StudentBean){return this.toString().equals(((StudentBean)obj).toString());}return false;

*String类中equals与==的区别

ps: String类中的 == 比较引用地址是否相同,equals() 比较字符串的内容是否相同。
在这里插入图片描述

equals与==的区别

“==”用来比较基本数据类型(int ,double…)时候是直接比较数值,比较引用数据类型(class,接口…)的时候比较的是对象的引用和地址。

equals没有重写之前比较的是两个实例引用的是不是同一个对象,但是重写之后比较的两个对象的内容是不是相同

相关内容

热门资讯

速达股份涨0.07%,成交额4... 1月12日,速达股份涨0.07%,成交额4294.00万元,换手率2.35%,总市值30.71亿元。...
航材股份涨9.35%,成交额1... 1月12日,航材股份涨9.35%,成交额10.40亿元,换手率13.58%,总市值306.36亿元。...
大明电子涨0.47%,成交额1... 1月12日,大明电子涨0.47%,成交额1.13亿元,换手率9.54%,总市值153.80亿元。异动...
苏州规划涨6.62%,成交额2... 1月12日,苏州规划涨6.62%,成交额2.41亿元,换手率12.43%,总市值30.03亿元。异动...
无线传媒涨6.73%,成交额6... 1月12日,无线传媒涨6.73%,成交额6.70亿元,换手率12.10%,总市值145.20亿元。异...