场景:当我们使用toString方法想要输出对象变量时,官方提供的toString方法会直接输出对象所在的地址,而不是我们想要的对象变量,所以我们要把toString方法进行重写。
改写代码:
@Override public String toString() { return "Student{" + "name='" + name + '\'' + ", sex=" + sex + ", age=" + age + '}'; }
调用代码:
public static void main(String[] args) { Student s = new Student("沙雕", '男', 23); String rs = s.toString(); System.out.println(rs); System.out.println(s.toString()); // 直接输出对象变量,默认可以省略toString调用不写的 System.out.println(s); }
场景:当我们想要使用equals方法比较集合中两个对象变量是否相等时,使用官方提供的equals方法比较的是两个对象的地址,结果显然为false(比较的对象不是同一个),那么我们需要将equals方法进行重写。
官方代码改写:
/** 定制相等规则。 两个对象的内容一样就认为是相等的 s1.equals(s2) 比较者:s1 == this 被比较者: s2 ==> o */ @Override public boolean equals(Object o) { // 1、判断是否是同一个对象比较,如果是返回true。 if (this == o) return true; // 2、如果o是null返回false 如果o不是学生类型返回false ...Student != ..Pig if (o == null || this.getClass() != o.getClass()) return false; // 3、说明o一定是学生类型而且不为null Student student = (Student) o; return sex == student.sex && age == student.age && Objects.equals(name, student.name); }
自己代码改写:
/** 自己重写equals,自己定制相等规则。 两个对象的内容一样就认为是相等的 s1.equals(s2) 比较者:s1 == this 被比较者: s2 ==> o */ /* @Override public boolean equals(Object o){ // 1、判断o是不是学生类型 if(o instanceof Student){ Student s2 = (Student) o; // 2、判断2个对象的内容是否一样。 // if(this.name.equals(s2.name) && // this.age == s2.age && this.sex == s2.sex){ // return true; // }else { // return false; // } return this.name.equals(s2.name) && this.age == s2.age && this.sex == s2.sex ; }else { // 学生只能和学生比较,否则结果一定是false return false; } }*/
代码调用:
public static void main(String[] args) { Student s1 = new Student("沙雕", '男', 19); Student s2 = new Student("沙雕", '男', 19); // equals默认是比较2个对象的地址是否相同,子类重写后会调用子类重写的来比较内容是否相同。 System.out.println(s1.equals(s2)); System.out.println(s1 == s2); System.out.println(Objects.equals(s1, s2)); }