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方法,输出对象的属性
@Override
public 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){
//判断地址是否相同
//判断测试的是否是同一个对象
//如果是同一个对象,毋庸置疑,它应该返回True
if(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没有重写之前比较的是两个实例引用的是不是同一个对象,但是重写之后比较的两个对象的内容是不是相同