Java中的Object类解析与应用探究

在这里插入图片描述

作为一名对技术充满热情的学习者,我一直以来都深刻地体会到知识的广度和深度。在这个不断演变的数字时代,我远非专家,而是一位不断追求进步的旅行者。通过这篇博客,我想分享我在某个领域的学习经验,与大家共同探讨、共同成长。请大家以开放的心态阅读,相信你们也会在这段知识之旅中找到启示。


前言

我们开始新的模块学习java常用类的概述和使用,今天我们就来聊聊Object类


一、Object类的基本概念

  • java.lang.Object类是Java语言中类层次结构的根类,也就是说任何一个类都是该类的直接或者间
    接子类。
  • 如果定义一个Java类时没有使用extends关键字声明其父类,则其父类为 java.lang.Object 类。
  • Object类定义了“对象”的基本行为, 被子类默认继承。

二、常用的方法

在Java中,Object类是所有类的根类。换句话说,每个类都直接或间接地继承自Object类。Object类定义了一些基本的方法,这些方法可以在所有Java对象中使用,包括:

  1. equals(Object obj):用于比较两个对象是否相等。默认情况下,equals方法比较的是对象的引用,即判断两个对象是否指向内存中的同一位置。但是,可以在子类中重写equals方法以实现自定义的相等性比较。

  2. hashCode():返回对象的哈希码值。哈希码值是根据对象的内存地址计算得出的,它通常用于在哈希表等数据结构中确定对象的存储位置。

  3. toString():返回对象的字符串表示形式。默认情况下,toString方法返回的是类名后跟该对象的哈希码值的十六进制表示。通常,我们会在子类中重写toString方法,以返回对象更有意义的字符串表示形式。

  4. getClass():返回对象的运行时类(Runtime Class)。可以使用getClass方法获取对象所属的类的信息,包括类的名称、包名等。

  5. clone():用于创建并返回当前对象的一个拷贝。需要注意的是,clone方法是浅拷贝,即它只会复制对象的字段值,而不会复制对象引用的其他对象。如果需要实现深拷贝,则需要在子类中重写clone方法并对引用类型的字段进行单独处理。

  6. finalize():用于在对象被垃圾回收之前执行清理操作。然而,由于finalize方法的执行时机不确定,而且在现代Java中已经不推荐使用显式的垃圾回收技术,因此finalize方法已经不推荐使用。

Object类的存在使得Java的类体系具有统一的根基础,提供了一组通用的方法,这些方法可以被所有类所使用,同时也为开发者提供了便利。

  • 我们将详细讲解一下下面常用的方法:
    在这里插入图片描述

三、练习如何使用Object类的常用方法

  • 案例题目:

    • 编程实现Student类的封装,特征:学号(id)和姓名,要求提供打印所有特征的方法。
    • 编程实现StudentTest类,在main方法中使用有参方式构造两个Student类型的对象并打印特征。
  • 题目扩展:

  • 如何实现以姓名作为基准判断两个对象是否相等?以及以学号和姓名同时作为基准判断两个对象是否相等?
import java.util.Objects;

public class Student extends Object {
    private int id; // 用于描述学号的成员变量
    private String name; // 用于描述姓名的成员变量

    public Student() {
    }

    public Student(int id, String name) {
        setId(id);
        setName(name);
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        if (id > 0) {
            this.id = id;
        } else {
            System.out.println("学号不合理哦!!!");
        }
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return id == student.id &&
                Objects.equals(name, student.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id, name);
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
/*
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Student student = (Student) o;

        if (id != student.id) return false;
        return name != null ? name.equals(student.name) : student.name == null;
    }

    @Override
    public int hashCode() {
        int result = id;
        result = 31 * result + (name != null ? name.hashCode() : 0);
        return result;
    }

 */
    /**
     * 为了比较两个对象的内容,也就是学号信息需要重写该方法
     */
    // Student this = s1;
    // Object obj = s2;
    /*
    @Override
    public boolean equals(Object obj) {
        // 当调用对象和参数对象指向同一个对象时,则内容一定相同
        if (this == obj) return true;
        // 当调用对象为不为空而参数对象为空时,则内容一定不相同
        if (null == obj) return false;
        // 判断obj指向的对象是否为Student类型的对象,若是则条件成立,否则条件不成立
        if (obj instanceof Student) {
            Student ts = (Student) obj;
            // 以学号作为基准判断两个对象是否相等  int是基本数据类型,内存空间中放的就是数据本身,使用 == 可以判断数据是否相同
            //return this.getId() == ts.getId();
            // 以姓名作为基准判断两个对象是否相等  String是引用数据类型,内存空间中放的是地址,使用 == 判断地址是否相同
            // 也就是判断两个对象中姓名字符串的地址是否相同,不够完美
            //return this.getName() == ts.getName();
            return this.getName().equals(ts.getName()); // 比较姓名字符串的内容是否相同
        }
        // 否则类型不一致没有可比性,则内容一定不相同
        return false;
    }
    */
    /**
     * 为了使得该方法的结果与equals方法的结果保持一致,从而满足Java官方的常规协定,需要重写该方法
     */
    /*
    @Override
    public int hashCode() {
        //return getId(); // 不再代表内存地址的编号了
        final int type = 12;
        //return type*31 + getId();
        return type*31 + getName().hashCode();
    }
    */
    /**
     * 为了返回更有意义的字符串数据,则需要重写该方法
     */
    /*
    @Override
    public String toString() {
        return "Student[id = " + getId() + ", name = " + getName() + "]";
    }
     */
}


public class StudentTest {

    public static void main(String[] args) {

        // 1.使用有参方式构造Student类型的两个对象并判断是否相等
        Student s1 = new Student(1001, "zhangfei");
        //Student s2 = new Student(1002, "guanyu");
        Student s2 = new Student(1001, "zhangfei");
        //Student s2 = s1;  // 表示s2和s1都指向了同一个对象,地址相同了
        // 下面调用从Object类中继承下来的equals方法,该方法默认比较两个对象的地址,可以查看源码验证
        // 当Student类中重写equals方法后,则调用重写以后的版本,比较内容
        //boolean b1 = s1.equals(s2);
        //Student s3 = null;
        //boolean b1 = s1.equals(s3);
        //Student s3 = s1;
        boolean b1 = s1.equals(s2);
        System.out.println("b1 = " + b1); // false true
        System.out.println(s1 == s2); // 比较地址  false

        System.out.println("----------------------------------------------------------");
        // 下面调用从Object类中继承下来的hashCode方法,获取调用对象的哈希码值(内存地址的编号)
        // 当Student类中重写hashCode方法后,则调用重写以后的版本
        int ia = s1.hashCode();
        int ib = s2.hashCode();
        System.out.println("ia = " + ia);
        System.out.println("ib = " + ib);

        System.out.println("----------------------------------------------------------");
        // 下面调用从Object类中继承下来的toString方法,获取调用对象的字符串形式:包名.类名@哈希码值的十六进制
        // 当Student类中重写toString方法后,则调用重写以后的版本:Student[id = 1001, name = zhangfei]
        String str1 = s1.toString();
        System.out.println("str1 = " + str1); // com.lagou.task11.Student@55d
        System.out.println(s1); // 当打印一个引用变量时会自动调用toString方法
        String str2 = "hello" + s1;
        System.out.println("str2 = " + str2);
    }
}

以上代码对常用方法进行了使用,注释需自己看

四、常见面试题

  1. equals() 方法和 == 运算符有什么区别?

    • equals() 方法: 用于比较两个对象的内容是否相等。默认情况下,equals() 方法比较的是对象的引用地址,即两个对象是否指向内存中的同一块区域。但是,可以通过在类中重写 equals() 方法来改变其默认行为,实现自定义的对象相等性比较。

    • == 运算符: 用于比较两个对象的引用是否相等,即它们是否指向内存中的同一块区域。即使是同一个对象的拷贝(即两个对象的内容相同但是引用不同),使用 == 运算符也会返回 false。

    • 区别: equals() 方法比较的是对象的内容,而 == 运算符比较的是对象的引用。在实际应用中,应根据具体的需求来选择使用 equals() 方法还是 == 运算符。

  2. hashCode() 方法的作用是什么?

    • hashCode() 方法: 返回对象的哈希码值。哈希码值是根据对象的内存地址计算得出的一个整数,它通常用于在哈希表等数据结构中确定对象的存储位置。在 Java 中,hashCode() 方法被广泛用于集合类(如HashMap、HashSet等)的实现中,以提高元素的查找效率。
  3. 为什么重写 equals() 方法时通常也要重写 hashCode() 方法?

    • 在 Java 中,如果两个对象在 equals() 方法中被判定为相等,那么它们的 hashCode() 方法应该返回相同的值。
    • 这是因为在使用哈希表等数据结构时,对象的 hashCode() 值用于确定对象在表中的存储位置。如果两个对象在 equals() 方法中被判定为相等,但是它们的 hashCode() 方法返回的值不同,这将导致在哈希表中存储的位置不一致,进而可能导致在查找、插入等操作时出现问题。
    • 因此,为了保持一致性,在重写 equals() 方法时通常也需要重写 hashCode() 方法,以确保对象相等时它们的哈希码值相同。
  4. toString() 方法的作用是什么?

    • toString() 方法: 返回对象的字符串表示形式。默认情况下,toString() 方法返回的是对象的类名后跟该对象的哈希码值的十六进制表示。但是,可以通过在类中重写 toString() 方法来返回对象更有意义的字符串表示形式,以便于调试、日志输出等场景的使用。
  5. finalize() 方法的作用是什么?

    • finalize() 方法: 用于在对象被垃圾回收之前执行清理操作。然而,由于 finalize() 方法的执行时机不确定(甚至有可能不会被执行),而且在现代 Java 中已经不推荐使用显式的垃圾回收技术,因此 finalize() 方法已经不推荐使用,更好的方式是使用 try-with-resources 或者 try-finally 结构来进行资源的释放和清理。

总结

感谢大家抽出宝贵的时间来阅读博主的博客,新人博主,感谢大家关注点赞,祝大家未来的学习工作生活一帆风顺,加油!!!
在这里插入图片描述

  • 35
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java.applet.Applet 简单实现!~ 网页表格组件 GWT Advanced Table GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以直接在你的网页里面显示搜查的结果。 github-java-api github-java-api 是 Github 网站 API 的 Java 语言版本。 java缓存工具 SimpleCache SimpleCache 是一个简单易用的java缓存工具,用来简化缓存代码的编写,让你摆脱单调乏味的重复工作!1. 完全透明的缓存支持,对业务代码零侵入 2. 支持使用Redis和Memcached作为后端缓存。3. 支持缓存数据分区规则的定义 4. 使用redis作缓存时,支持list型的高级数据结构,更适合论坛帖子列表这种型的数据 5. 支持混合使用redis缓存和memcached缓存。可以将列表数据缓存到redis,其他kv结构数据继续缓存到memcached 6. 支持redis的主从集群,可以做读写分离。缓存读取自redis的slave节点,写入到redis的master节点。 Java对象的SQL接口 JoSQL JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该需求可以通过快速配置来开发。AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器 j2wap j2wap 是一个基于Java的WAP浏览器,目前处于BETA测试阶段。它支持WAP 1.2规范,除了WTLS 和WBMP。 Java注册表操作 jared jared是一个用来操作Windows注册表的 Java 库,你可以用来对注册表信息进行读写。 GIF动画制作工具 GiftedMotion GiftedMotion是一个很小的,免费而且易于使用图像互换格式动画是能够设计一个有趣的动画了一系列的数字图像。使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,时间显示和处理方法前帧。 Java的PList库 Blister Blister是一个用于操作苹果二进制PList文件格式的Java开源库(可用于发送数据给iOS应用程序)。 重复文件检查工具 FindDup.tar FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端 JOpenID JOpenID是一个轻量级的OpenID 2.0 Java客户端,仅50KB+(含源代码),允许任何Web网站通过OpenID支持用户直接登录而无需注册,例如Google Account或Yahoo Account。 JActor的文件持久化组件 JFile JFile 是 JActor 的文件持久化组件,以及一个高吞吐量的可靠事务日志组件。 Google地图JSP标签库 利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还能够与JSTL相结合生成数据库驱动的动态Maps。 OAuth 实现框架 Agorava Agorava 是一个实现了 OAuth 1.0a 和 OAuth 2.0 的框架,提供了简单的方式通过社交媒体进行身份认证的功能。 Eclipse的JavaScript插件 JSEditor JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮以及一些通用的面向对象方法。 Java数据库连接池 BoneCP BoneCP 是一个高性能的开源java数据库连接池实现库。它的设计初衷就是为了提高数据库连接池的性能,根据某些测试数据发现,BoneCP是最快的连接池。BoneCP很小,只有四十几K
基于Android的毕业论文管理系统的设计与研究全文共6页,当前为第1页。基于Android的毕业论文管理系统的设计与研究全文共6页,当前为第1页。基于Android的毕业论文管理系统的设计与研究 基于Android的毕业论文管理系统的设计与研究全文共6页,当前为第1页。 基于Android的毕业论文管理系统的设计与研究全文共6页,当前为第1页。 面对Android手机如此迅速发展的今天,毕业论文管理系统等似的软件出现在手机终端的机会将会越来越多,同时其发展的速度也会越来越快。毕业论文管理系统作为传统WEB应用,也必将在手机客户端上得到应用。      一、构建系统的整体框架      (一)采用的技术手段和方法      技术手段:系统采用C/S结构,MVC软件开发模式,前台使用Eclipse开发,后台服务器使用Servlet编写服务器,同时用Tomcat作为服务器,前台客户端环境使用的是Android控件【2】.通过JDBC来调用Mysql数据库,来实现手机客户端与服务器之间数据传输。数据传输的采取的技术是JSON技术,JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。JSON是完全独立的文本格式,而且还使用了一个语言习惯似C家族(包括C,C+ +,C#,JavaJavaScript,Perl,Python和等)。这些特性使JSON成为理想的数据交换语言。易于读取和写入,也易于机器解析和生成。      研究方法主要有如下三种:      1.问卷调查法。采取发放问卷的方式,了解系统应该实现哪些功能以及后续的系统的完善等。      2.资料和文献法。查阅相关资料和文献,解决系统设计过程出现的关键问题。      3.科学实验法。用黑盒和白盒的方式对系统的整体性能进行测试。      (二)整体框架。 基于Android的毕业论文管理系统的设计与研究全文共6页,当前为第2页。基于Android的毕业论文管理系统的设计与研究全文共6页,当前为第2页。      本系统采用MVC框架,该框架有良好的可扩展性,便于后续的扩展和修改,细化的结构分支为:      1.用户管理:添加用户,用户信息修改。      2.论题管理:上传题目,修改题目,审核题目,选择题目。      3.论文管理:论文上传,论文下载,论文审核。      系统框架图如下图所示:      二、数据库设计      系统运行的核心是一个稳定运行的数据库,数据库设计的优良直接影响到整个系统运行状况.      (一)数据库需求分析      本系统的需求主要体现在用户管理、论题管理、论文管理上。因此,需要设计一个满足要求并且能对各种信息进行存储的数据库。总结得出基于Android的毕业论文管理系统的数据库要满足如下数据库需求:      该系统的用户有:管理员、学生、教师。其教师和学生用户的编号都要能唯一标识出人物身份。管理员、教师和学生用户的都应该是一个非空集合。论题和论文必须还有基于Android的毕业论文管理系统的设计与研究全文共6页,当前为第3页。基于Android的毕业论文管理系统的设计与研究全文共6页,当前为第3页。教师的外键约束。      (二) 数据库的概念结构设计      根据上述数据库需求分析,可知本系统的实体有管理员实体、普通用户实体、论文实体。      E-R模型的组成包含三个元素:实体、属性、联系。E-R模型用E-R图表示。实体是用户工作环境所涉及的事务,属性是对实体特征的描述。      从数据需求分析得出系统的实体属性图,遵循三范式原则,对实体之间的依赖关系进行了整合,得出E-R图。      (三)数据库逻辑结构设计      数据库结构设计之后,就要将上面的数据库概念模型转化成数据库系统所支持的实际数据模型,也就是数据库的逻辑结构本系统采用的是MySQL数据库,定义管理员表、普通用户表、论文表、题目表和选择表,具体表的设计这里不再详述。      三、各模块的设计      (一)用户管理模块的设计      用户管理模块:该模块主要包含了用户的添加及删除、基本资料修改和个人信息主页,也是对本系统用户的信息的统一管理,实现登录等操作的必备模块。 基于Android的毕业论文管理系统的设计与研究全文共6页,当前为第4页。基于Android的毕业论文管理系统的设计与研究全文共6页,当前为第4页。      系统将根据登录用户角色的不同为用户分配相应的功能。本系统的所有角色都是采用的登录名+密码的方式进行登录。管理员,学生,老师都通过用户名+密码的方式验证登陆。      Android登录界面采用的是线性布局LinearLayout,需要设计本界面按取登陆按键需

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值