Object中的toString方法
Object中的equals方法
小结:
1、如果直接输出对象名不想输出地址值,重写toString方法
2、如果想比较两个对象的内容,就重写一下equals方法
3、怎么重写:alt+insert->选toString或者equals and hashcode ->啥也不要管->一路下一步就可以了。
Object中的equals
js
1、概述:比较两个对象的地址值是否相等
public boolean equals(Object obj) {
return (this == obj);
}
== 针对于基本数据类型来说,比较的是值
== 针对于引用数据类型来说,比较的是地址值
java
public class Test02 {
public static void main(String[] args) {
Person p1 = new Person("金莲", 26);
Person p2 = new Person("金莲", 26);
System.out.println(p1 == p2); // false
System.out.println(p1.equals(p2)); // false
System.out.println("======")
String s1 = new String("abc");
String s2 = new String("abc");
System.out.println(s1==s2); // false
System.out.println(s1.equals(s2)); // true equal比较的不是定值,而是内容
}
}
string当中equals

重写之后就不再比较地址值了。
2、注意: a、如果没有重写Object中的equals方法,那么就会调用Object中的equals方法,比较对象的地址值。 b、如果重写了Object中的equals方法,那么就会调用重写后的equals方法,应该比较对象的内容。
java
public class Person {
/*
问题1:obj直接调用name和age调用不了,因为Object接收了Person类型的对象属于多态,多态前提下不能直接调用子类特有内容
解决问题1:向下转型
*/
@Override
public boolean equals(Object obj){
Person p = (Person) obj;
return this.name.equals(p.name) && this.age==p.age;
}
}

因为比较的只是name和age的值,因为p1和p2里面内部的值是不是一样的。是,那就完事了。 那就是相等。
java
ArrayList<String> list = new ArrayList<>();
System.out.println(p1.equals(list))

现在object是不是接了一个list ArrayList。
问题2:如果传递的不是Person类型,就会出现类型转换异常。
解决问题2:先判断类型,如果是Person类型,再强转Person
问题3:如果传递null呢?就不用判断类型了,直接给false
问题4:如果传递自己呢?就不用判断非空也不用判断null了,直接给true。
java
System.out.println(p1.equals(null));
java
public boolean equals(Object obj) {
if (this==obj){
return true;
}
if (obj == null) {
return false;
}
if (obj instanceof Person) {
Person p = (Person) obj;
return this.name.equals(p.name) && this.age==p.age;
}
return false;
}
再引出快速生成。

重写,可以直接用人家写的equals() and hashCode(),

