Java基础之Object类详解

Java基础之Object类详解

Java中的Object类是所有Java类的祖先类,每个类都继承了Object类的一些方法。在本文中,我们将深入学习Object类,包括其方法以及如何正确重写Object类中的方法。

Object类中的方法

Object类提供了许多有用的方法,如下所示:

equals方法

equals方法用于比较两个对象是否相等,默认情况下,它会比较两个对象的内存地址是否相同,实际开发中,我们需要重写equals方法,以便比较我们关心的对象属性是否相等。

示例1:比较两个字符串是否相等

String s1 = "hello";
String s2 = "hello";
if(s1.equals(s2)){
    System.out.println("s1和s2相等");
}

示例2:比较两个自定义对象是否相等

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 (this == obj) {
            return true;
        }
        if (obj == null || getClass() != obj.getClass()) {
            return false;
        }
        Person person = (Person) obj;
        return age == person.age && Objects.equals(name, person.name);
    }
}
Person p1 = new Person("张三", 20);
Person p2 = new Person("张三", 20);
if(p1.equals(p2)){
    System.out.println("p1和p2相等");
}

hashCode方法

hashCode方法用于获取对象的哈希值,哈希值由对象的内存地址计算而得,通常用于散列表中。

示例1:获取字符串的哈希值

String s = "hello";
int hashCode = s.hashCode();
System.out.println("字符串hello的哈希值为:" + hashCode);

toString方法

toString方法返回对象的字符串表示,通常用于调试和日志记录。

示例1:打印字符串对象

String s = "hello";
System.out.println(s.toString());

getClass方法

getClass方法返回对象所属的Class对象,我们可以利用Class对象进行反射操作。

示例1:获取字符串的Class对象

String s = "hello";
Class<? extends String> aClass = s.getClass();
System.out.println("字符串hello所属的Class对象是:" + aClass.getName());

重写Object类中的方法

在开发中,我们有时需要比较两个自定义对象是否相等,而不是简单地比较它们的内存地址;有时我们需要自定义哈希计算方法;有时我们需要自定义字符串表示等。这时,我们需要重写Object类中的一些方法。

重写equals方法

示例1:比较两个自定义对象是否相等

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 (this == obj) {
            return true;
        }
        if (obj == null || getClass() != obj.getClass()) {
            return false;
        }
        Person person = (Person) obj;
        return age == person.age && Objects.equals(name, person.name);
    }
}
Person p1 = new Person("张三", 20);
Person p2 = new Person("张三", 20);
if(p1.equals(p2)){
    System.out.println("p1和p2相等");
}

在重写equals方法时,应该注意以下几点:

  1. equals方法必须满足自反性、对称性、传递性和一致性。
  2. equals方法传入的参数类型应该是Object类型,而不是自定义类型。
  3. equals方法应该比较所有关键字段,通常需要使用Objects.equals方法进行比较。

重写hashCode方法

示例1:自定义哈希计算方法

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);
    }
}
Person p1 = new Person("张三", 20);
int hashCode = p1.hashCode();  
System.out.println("自定义哈希值为:" + hashCode);

在重写hashCode方法时,应该注意以下几点:

  1. 如果重写了equals方法,就必须同时重写hashCode方法。
  2. hashCode方法应该返回一个整数,通常使用Objects.hash方法计算哈希值。

重写toString方法

示例1:自定义字符串表示

class Person{
    private String name;
    private int age;
    public Person(String name, int age){
        this.name = name;
        this.age = age;
    }
    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
Person p1 = new Person("张三", 20);
System.out.println(p1.toString());

在重写toString方法时,应该注意以下几点:

  1. toString方法应该返回一个字符串,通常包含对象中所有关键字段的字符串表示。
  2. 不要在toString方法中调用其他方法,避免出现死循环。

总结

Object类是Java中最基础、最重要的一类,掌握Object类中的方法和重写方法,是Java编程的基本功。在实际开发中,我们需要根据不同的情况,正确使用Object类中的方法和重写方法,以获得更好的程序效果。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java基础之Object类详解 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • Java 8 Stream 处理数据方法汇总

    Java 8 Stream 处理数据方法汇总 什么是 Java 8 Stream Java 8 Stream 是在 JDK 8 中引入的一个新的 API,它提供了一种更为优雅和高效的处理集合类数据的方法。 Stream 提供了一种流式处理数据的方式,它可以实现类似于 SQL 的聚合操作,如过滤、映射、分组和归约等操作。与传统的集合框架相比,Stream 代码…

    Java 2023年5月26日
    00
  • 在js与java中判断json数据中是否含有某字段的案例

    在 JS 中判断 JSON 数据中是否含有某字段的方法如下: 使用 in 运算符: const jsonData = { name: ‘Tom’, age: 18 }; if (‘name’ in jsonData) { console.log(‘jsonData 存在 name 字段’); } 使用 hasOwnProperty() 方法: const j…

    Java 2023年5月26日
    00
  • PHP关于IE下的iframe跨域导致session丢失问题解决方法

    下面我就为您详细讲解“PHP关于IE下的iframe跨域导致session丢失问题解决方法”的完整攻略。首先,我们需要了解IE浏览器下iframe跨域访问的情况。 什么是IE下的iframe跨域访问? 在IE浏览器下,iframe跨域访问是指父窗口和子窗口(即iframe窗口)在不同的域名下,例如父窗口域名为www.example.com,而子窗口的域名为w…

    Java 2023年6月16日
    00
  • Java中的线程是什么?

    Java中的线程是程序执行的最小单位。线程是指在单个程序中执行的一组指令,这些指令共享同一个进程,并且可以访问相同的变量和对象。在Java中,线程是通过Thread类来实现的。 创建线程的方式 在Java中,创建线程有两种方式: 继承Thread类 通过继承Thread类并重写run方法来创建线程。示例代码如下: class MyThread extends…

    Java 2023年4月28日
    00
  • JS+Struts2多文件上传实例详解

    JS+Struts2多文件上传实例详解 简介 在现代web应用中,文件上传功能变得越来越常见。本文将介绍如何使用JavaScript和Struts2框架实现多文件上传功能。 实现步骤 1. 在HTML中创建上传表单 首先,在HTML页面中创建文件上传表单。使用<input>元素来创建上传表单并指定type=”file”。此外,我们还需在form元…

    Java 2023年5月20日
    00
  • 分析jackjson的安全漏洞CVE-2019-14379

    分析Jackjson的安全漏洞CVE-2019-14379可以通过以下几个步骤: 1.了解CVE-2019-14379漏洞的背景和影响 CVE-2019-14379是一个由Jackson-databind 库的反序列化漏洞引发的安全问题。这种漏洞可以让攻击者远程执行任意代码,从而导致服务器遭到攻击、数据丢失或泄露。 2.检查自己的应用程序是否受到漏洞的影响 …

    Java 2023年5月26日
    00
  • Spring JDBC的使用方法详解

    Spring JDBC的使用方法详解 前言 Spring JDBC 是 Spring Framework 框架中提供的一种数据访问技术,它的基础是 JdbcTemplate,通过其封装了对 JDBC 的访问,大大减少了开发数据访问层的代码量,提高了开发效率和代码的可维护性。本文将详细讲解 Spring JDBC 的使用方法,同时提供两个示例,帮助理解。 框架…

    Java 2023年5月20日
    00
  • 如何创建线程?

    以下是关于如何创建线程的完整使用攻略: 如何创建线程? 在Java中,可以通过继承Thread类或实现Runnable接口来创建线程。以下是创建线程的步骤: 继承Thread类创建线程 创建一个继承自Thread类的子类,并重写run()方法。 java public class MyThread extends Thread { public void r…

    Java 2023年5月12日
    00
合作推广
合作推广
分享本页
返回顶部