Object类:是Java继承结构中最顶层的类
任何一个类,都直接或间接继承Object类
常用方法:
toString() 打印对象的属性值
equals() 比较两个对象是否相等
hashCode() 返回对象的哈希码值
演示:先创建一个学生类:
public class NewStudent {
private String name;
private int age;
public NewStudent() {
}
public NewStudent(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
第一部分:to String():
public class Test {
public static void main(String[] args) {
NewStudent s1=new NewStudent("张三",23);
NewStudent s2=new NewStudent("张三",23);
System.out.println(s1.toString());
System.out.println(s1);
}
}
此时输出为:
这个时候,s1.toString()调用的toString()来自Object类
与此同时,当我们直接打印s1时,也是默认调用了toString方法
此时打印出的是s1的内存地址
若想打印出我们输入的内容,就需要在学生类中重写toString()方法
如下:
public String toString() {
return "NewStudent{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
选择要打印的内容即可
重写方法之后:
第二部分:equals()
System.out.println(s1.equals(s2));
当前输出:
此时使用的equals是来自Object类中的方法,
比较的是两个对象的内存地址
因而输出是false
继续重写方法:
@Override//检测字符
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
NewStudent that = (NewStudent) o;
if (age != that.age) return false;
return Objects.equals(name, that.name);
}
再次输出:
第三部分:hashCode()
System.out.println(s1.hashCode());
System.out.println(s2.hashCode());
输出:
如果没有进行方法的重写,是根据两个对象的内存地址来计算对象的哈希码值
重写方法:
@Override
public int hashCode() {
int result = name != null ? name.hashCode() : 0;
result = 31 * result + age;
return result;
}