《Object类》

目录

一、Object类

[1.1 定义与地位](#1.1 定义与地位)

[1.2 toString()方法](#1.2 toString()方法)

[1.3 equals()方法](#1.3 equals()方法)

[1.4 hashcode()方法](#1.4 hashcode()方法)


一、Object类

1.1 定义与地位

Object类是Java语言中的根类,所有的类(除了Object类)都直接或间接继承自Object。这就意味着在Java中,任何一个对象都可以被看作是Object类的实例。例如:

java 复制代码
class MyClass{}
public class Demo1 {
    public static void main(String[] args) {
        Object obj = new MyClass();
    }
}

我们也可以使用Object来接受所有类的对象

java 复制代码
class Person{}
class Doctor{}
public class Demo3 {
    public static void func(Object obj){
        System.out.println(obj);
    }
    public static void main(String[] args) {
        func(new Person());
        func(new Doctor());
    }
}

在帮助文档中我们可以查到Object类中的方法。如下:

我们先来熟悉一下toString()方法、equals()方法和hashcode()方法。

1.2 toString()方法

作用:该方法返回一个字符串,用于描述对象的信息。默认情况下,它返回对象的类名和哈希码(十六进制表示)。例如:

java 复制代码
class Person{
    public String name;
    public int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}
public class Test1 {
    public static void main(String[] args) {
        Person person = new Person("zhangsan",12);
        System.out.println(person);
    }
}

我们也可以对toString方法进行重写,通常需要在自定义类中,以便返回更有意义的对象信息。

例如:

java 复制代码
class Person{
    public String name;
    public int age;

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

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
public class Test1 {
    public static void main(String[] args) {
        Person person = new Person("zhangsan",12);
        System.out.println(person);
    }
}

1.3 equals()方法

在Java中,用==进行比较时:

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

2.如果==左右两侧是引用类型变量,比较的是引用变量地址是否相同(是否引用同一个对象)。

3.如果要比较对象中内容,必须重写Object中的equals方法,因为equals方法默认也是按照地址比较的:

没重写时

java 复制代码
class Point{
    private int x;
    private int y;

    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }
}
public class Test2 {
    public static void main(String[] args) {
        Point point1 = new Point(1,2);
        Point point2 = new Point(1,2);
        System.out.println(point1.equals(point2));
    }
}

重写后:

java 复制代码
class Point{
    private int x;
    private int y;

    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Point point = (Point) o;
        return x == point.x && y == point.y;
    }
}
public class Test2 {
    public static void main(String[] args) {
        Point point1 = new Point(1,2);
        Point point2 = new Point(1,2);
        System.out.println(point1.equals(point2));
    }
}

结论:比较对象的内容是否相同时,一定要重写equals()方法。

1.4 hashcode()方法

作用:返回对象的哈希码值。哈希码主要用于在哈希表(如 Java 中的 HashMap 等集合类)中确定对象的存储位置。一般来说,两个相等的对象(根据 equals 方法判断)应该具有相同的哈希码。

我们认为两个名字相同,年龄相同的对象,将存储在同一个位置,如果不重写hashcode()方法,我们可以来看示例

代码:

java 复制代码
class Student{
    private String name;
    private int age;

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
}
public class Test3 {
    public static void main(String[] args) {
        Student student1 = new Student("zhangsan",15);
        Student student2 = new Student("zhangsan",15);
        System.out.println(student1.hashCode());
        System.out.println(student2.hashCode());
    }
}

两个对象的hash值不同。

当我们重写hashcode方法之后:

java 复制代码
import java.util.Objects;

class Student{
    private String name;
    private int age;

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
}
public class Test3 {
    public static void main(String[] args) {
        Student student1 = new Student("zhangsan",15);
        Student student2 = new Student("zhangsan",15);
        System.out.println(student1.hashCode());
        System.out.println(student2.hashCode());
    }
}

结论

1、hashcode方法用来确定对象在内存中存储的位置是否相同。

2、事实上hashCode() 在散列表中才有用,在其它情况下没用。在散列表中hashCode() 的作用是获取对象的 散列码,进而确定该对象在散列表中的位置。

相关推荐
摇光932 分钟前
js观察者模式
开发语言·javascript·观察者模式
kse_music13 分钟前
常用的排序算法(Java版)
java·算法·排序算法
山茶花开时。14 分钟前
[SAP ABAP] 使用LOOP AT...ASSIGNING FIELD-SYMBOL 直接更新内表数据
开发语言·sap·abap
xiaoshiguang315 分钟前
LeetCode:216.组合总和III
java·算法·leetcode
java熊猫1 小时前
CSS语言的网络编程
开发语言·后端·golang
生活很暖很治愈1 小时前
C语言之旅5--分支与循环【2】
c语言·开发语言
Xudde.1 小时前
HTML中meta的用法
java·前端·javascript·笔记·html
nece0012 小时前
PHP的扩展Imagick的安装
开发语言·php
Panda-gallery2 小时前
【Rust】常见集合
开发语言·后端·rust
陈序缘2 小时前
Rust实现智能助手 - 项目初始化
开发语言·后端·语言模型·rust