Object类
Object类是所有类的父类
类中有一些方法(都需要掌握)
toString()方法
在学习类的对象的时候有介绍过了,当我们重新给此方法就会打印类与对象的信息
equals()方法
在Java中的比较,
如果==左右两侧是基本类型变量,比较的是变量中值是否相同。
如果==左右两侧是引用类型变量,比较的是引用变量地址是否相同。
如果要比较引用类型指向的值相同,需要重写equals()方法。
代码展示:
import java.util.Objects;
public class Student {private String name;private int age;public Student(String name, int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}
}
public class Test {public static void main(String[] args) {Student stu1 = new Student("lisi",18);Student stu2 = new Student("lisi",18);System.out.println(stu1 == stu2);System.out.println(stu1.equals(stu2));System.out.println("----------");String str1 = new String("abc");String str2 = new String("abc");System.out.println(str1 == str2);System.out.println(str1.equals(str2));}
}
输出:
false
flase
----------
false
true
代码解释:
1、对于对象,== 比较的是引用,即是否指向同一内存地址。Student是类stu1和stu2是引用变量,分别引用 Student 类创建的对象。
2、用equals()方法,当没有重写equals()方法时,调用父类Object类的equals()方法,比较的是两个地址是否相同,而非指向的内容是否相同。
3、为了能比较指向的内容是否相同,需要重写equals()方法。
(可以借助编译器生成)
@Override//进行了比较合理性的判断public boolean equals(Object o) {if (this == o) return true;//自己比自己if (o == null || getClass() != o.getClass()) return false;//为空和类型不相同,返回falseStudent student = (Student) o;return age == student.age && Objects.equals(name, student.name);}
此时之前的输出结果发生变化
输出:
false
true
----------
false
true
4、为什么String类的equals()方法比较的是指向的内容?因为String本身已经重写了equals()方法。
hashCode()方法
源码:
public native int hashCode();
我们认为两个名字相同,年龄相同的对象,将存储在同⼀个位置。当没有重写hashCode()方法时,他们的hash值不相同。
我们需要重写hashCode()方法。
(可以借助编译器生成)
@Overridepublic int hashCode() {return Objects.hash(name, age);}
其他关于hashCode()方法知识后续在讲。
其他方法之后学习中介绍
总结
对于我们自定义的类时,我们最好通过编译器重写toString()方法、equals()方法等。