> 文章列表 > toString()、equals()是什么,为啥需要重写,多种方法来重写

toString()、equals()是什么,为啥需要重写,多种方法来重写

toString()、equals()是什么,为啥需要重写,多种方法来重写

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相同,或都为空不为空时的判断:
toString()、equals()是什么,为啥需要重写,多种方法来重写
toString()、equals()是什么,为啥需要重写,多种方法来重写

(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() 比较字符串的内容是否相同。
toString()、equals()是什么,为啥需要重写,多种方法来重写

equals与==的区别

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

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