【Java】祖宗Object类


前言

在之前我们对Java的抽象类与接口进行深入的了解,今天我们来进一步学习Java中的“祖宗类”——Object类。本篇文章将详细介绍Java语言中的Object类及其包含的toString()方法、equals()方法和hashcode()方法。让我们开始吧!!在这里插入图片描述


一、Object类

1.1 Object类是什么

Object是Java默认提供的一个类。Java中除了Object类,所有的类都是存在继承关系的。
默认会继承Object类。
即所有类的对象都可以使用Object的引用进行接收。

(会有一种Object类是所有类的祖先/始祖的感觉XD)

举个栗子🌰:用Object类接收其他类的对象

class Student{}
class Teacher{}
public class test {
    public static void func(Object obj){//参数为Object类
        System.out.println(obj);
    }
    public static void main(String[] args) {
        Student stu = new Student();
        Teacher tea = new Teacher();
        func(stu);
        func(tea);
    }
}

运行结果:
Student@1b6d3586
Teacher@4554617c

所以在开发之中,Object类是参数的最高统一类型,同时该类还具有一些已经定义好的方法:

1.我们通过IDEA来实现查找
2.双击shift在这里插入图片描述
3.点击后左侧或快捷键shift+7来查看类中方法在这里插入图片描述
接下来主要来了解以下三个方法:toString()方法、equals()方法和hashcode()方法

1.2 获取对象信息toString方法

根据查找我们可以看到定义的toString()方法:
在这里插入图片描述
Object类中的toString方法返回值是一个字符串:类名+“@”+该对象的哈希码的无符号十六进制表示组成

但我们一般使用时返回的都是直观简洁以文本信息表示的字符串,建议子类使用时都重写此方法。

1.3 对象比较equals方法

查找equals方法具体代码如下:
在这里插入图片描述
可以发现返回值中有==判断,那么我们需要先对该符号在Java中的使用有所了解。

在Java中,== 会返回Boolean值,进行比较时:

  1. 如果 == 左右两侧是基本类型变量,比较的是变量中的值是否相同
  2. 如果 == 左右两侧是引用类型变量,比较的是引用变量地址是否相同

由此我们可以知道,如果要比较对象中内容,必须要重写Object类中的equals方法,因为equals方法中的返回内容也是按照地址进行比较的(如上图:return(this == obj))。

package demo1;
class Person{
    private String name;
    private int age;
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}
public class test1 {
    public static void main(String[] args) {
        Person p1 = new Person("owo",18);
        Person p2 = new Person("omo",2);
        int a = 1;
        int b = 1;
        System.out.println(a == b);//基本类型变量比较
        System.out.println(p1 == p2);//引用类型变量比较
        System.out.println(p1.equals(p2));//equals方法比较
    }
}

编译结果:
true
false
false

Person类重写equals方法后,然后比较:

package demo1;
class Person{
    private String name;
    private int age;
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    @Override
    public boolean equals(Object obj){
        if(obj == null){
            return false;
        }
        if(!(obj instanceof Person)){
            return false;
        }
        if(this == obj){
            return true;
        }
       //比较属性值,使用向下转型
        Person person = (Person)obj;
        return this.name.equals(person.name) && this.age == person.age;
    }
}
public class test1 {
    public static void main(String[] args) {
        Person p1 = new Person("owo",18);
        Person p2 = new Person("omo",18);
        int a = 1;
        int b = 1;
        System.out.println(a == b);//基本类型变量比较
        System.out.println(p1 == p2);//引用类型变量比较
        System.out.println(p1.equals(p2));//equals方法比较
    }
}

1.4 hashcode方法

我们先来回忆刚刚的toString方法:
在这里插入图片描述
我们可以看到有hashcode方法。该方法作用是帮我算了一个具体的对象位置,确定对象在内存中存储的位置是否相同,这里面涉及数据结构,暂时没法讲述,理解为一个内存地址(暂时),然后调用integer.toHexString方法,将这个地址以十六进制输出。

hashcode源码:
在这里插入图片描述
PS:这是个native 方法,底层是由C/C++代码写的,我们看不到。

我们认为两个名字相同年龄相同的人,应存储在同一位置。那么在Java环境中如何呢?我们看一段代码:

package demo1;
class Person{
    private String name;
    private int age;
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    @Override
    public boolean equals(Object obj){
        if(obj == null){
            return false;
        }
        if(!(obj instanceof Person)){
            return false;
        }
        if(this == obj){
            return true;
        }
       //比较属性值,使用向下转型
        Person person = (Person)obj;
        return this.name.equals(person.name) && this.age == person.age;
    }
}
public class test1 {
    public static void main(String[] args) {
        Person p1 = new Person("owo",18);
        Person p2 = new Person("owo",18);
        
        System.out.println(p1.hashCode());
        System.out.println(p2.hashCode());

    }
}

在这里插入图片描述
可以看到:两个对象的hash值不一样。

同样我们也可以重写hashcode()方法:

package demo1;

import java.util.Objects;

class Person{
    private String name;
    private int age;
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public int hashCode() {
        return Objects.hash(name,age);
    }
}
public class test1 {
    public static void main(String[] args) {
        Person p1 = new Person("owo",18);
        Person p2 = new Person("owo",18);
        int a = 1;
        int b = 1;
        System.out.println(a == b);//基本类型变量比较
        System.out.println(p1 == p2);//引用类型变量比较
        System.out.println(p1.equals(p2));//equals方法比较
        System.out.println(p1.hashCode());
        System.out.println(p2.hashCode());

    }
}

在这里插入图片描述
现在,哈希值相同。


结语

好了以上就是本篇“【Java】祖宗Object类”博客的全部内容啦,感谢各位的阅读=v=,如有不足之处欢迎在评论区指正哦!!
觉得有帮助的话别忘了点赞三连支持一下欧!拜托啦这对我真的很重要o(>ω< )o!!!

请添加图片描述请添加图片描述请添加图片描述