《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() 的作用是获取对象的 散列码,进而确定该对象在散列表中的位置。

相关推荐
祈祷苍天赐我java之术5 小时前
Linux 进阶之性能调优,文件管理,网络安全
java·linux·运维
无处不在的海贼5 小时前
小明的Java面试奇遇之发票系统相关深度实战挑战
java·经验分享·面试
武子康5 小时前
Java-109 深入浅出 MySQL MHA主从故障切换机制详解 高可用终极方案
java·数据库·后端·mysql·性能优化·架构·系统架构
秋难降5 小时前
代码界的 “建筑师”:建造者模式,让复杂对象构建井然有序
java·后端·设计模式
bdgtd881786 小时前
动态修补C扩展模块的函数指针有哪些风险?安全的修补方案是什么?
c语言·开发语言·安全
luquinn6 小时前
实现统一门户登录跳转免登录
开发语言·前端·javascript
Forward♞6 小时前
Qt——界面美化 QSS
开发语言·c++·qt
BillKu6 小时前
Spring Boot 多环境配置
java·spring boot·后端
君不见,青丝成雪7 小时前
SpringBoot项目占用内存优化
java·spring boot·后端
一叶飘零_sweeeet7 小时前
如何避免MyBatis二级缓存中的脏读
java·redis·mybatis