Java- Object根父类

news2024/11/15 13:25:51

在java中,所有的类都有一个公共的父类,这个java.lang.Object类
*  * * Object所有类的根,成为超类。

1.证明Object是根

public class A_Object01 {

    public static void main(String[] args) {
        //证明Object是根
        //基本数据类型
        int a = 0;
        Object bytea = 2;
        Object shorta = 125;
        Object inta = 235;
        Object longa = 123455677;
        Object floatb = 12.8f;
        Object doublea = 123.456;
        Object chara = '好';
        Object booleana = true;

        //引用类型
        Object string = "String";
        Object arr1 = new String[5];
        Object arr2 = new Father[5];
  /*
    以上代码段都没有报错  可以证明Object是根

   */
    }
}//我们创建一个类时,如果没有明确继承一个父类,
// * 那么它就会自动继承 Object,成为 Object 的子类。
class Father {
}

2.Object类的其中5个方法

(1)toString()
 ①默认情况下,toString()返回的是“对象的运行时所属类型 @ 对象的hashCode值的十六进制形式"
②如果我们直接System.out.println(对象),默认会自动调用这个对象的toString()
   public static void main(String[] args) {
//        1.未重写toString方法
      /*  ToString02 obj1=new ToString02();
        System.out.println(obj1.toString());//day0419.arrange_and_summarize.object01.ToString02@1b6d3586
*/
        /*
        * 注意:一般情况下,我们需要的是结果值,而不是地址值。如何获取结果值呢?
        *  进行重写toString()方法后就可以拿到结果值
        * */


//2.重写toString
        ToString02 obj1=new ToString02("重写toString",87);
        System.out.println(obj1.toString());//输出ToString02{name='重写toString', age=87}
}
(2)getClass()

public final Class<?> getClass():获取对象的运行时类型

因为Java有多态现象,所以一个引用数据类型的变量的编译时类型与运行时类型可能不一致,因此如果需要查看这个变量实际指向的对象的类型,需要用getClass()方法

public class TestGetClass05 {
    public static void main(String[] args) {
/*1. GetClass04类
        GetClass04 obj1=new GetClass04("GetClass04类",18);
        System.out.println(obj1.getClass());//class day0419.arrange_and_summarize.object01.GetClass04*/
        //返回该对象对应的类
//2.OBJECT类
        Object obj2 = new GetClass04("OBJECT类", 18);
        System.out.println(obj2.getClass());//class day0419.arrange_and_summarize.object01.GetClass04
        //编译时是父类(Object),运行时是子类(Student03)}
(3)equals()
1.  重写equals原因
   equals: 用于判断当前对象this与指定对象obj是否“相等”
   ①在默认情况下,equals方法的实现等价于与“==”,比较的是对象的地址值
   ②但是我们想要的是当前对象this与指定对象obj是否“相等”,如何解决呢?
   答:重写equals方法
public class TestEquals07 {
    public static void main(String[] args) {
        Equals06 obj1 = new Equals06("obj1", 18);
        Equals06 obj2 = new Equals06("obj1", 18);
        Equals06 obj3 = new Equals06("obj3", 14);
        Equals06 obj4 = obj1;
        /*1.未重写*/
//        1.1未重写equals
       /* System.out.println(obj1.equals(obj2));//false
        System.out.println(obj1.equals(obj3));//false
        System.out.println(obj2.equals(obj3));//false
        System.out.println(obj4.equals(obj1));//true*/

        //1.2未重写hashCode方法
       /* System.out.println(obj1.hashCode());//460141958
        System.out.println(obj2.hashCode());//1163157884
        System.out.println(obj3.hashCode());//1956725890
        System.out.println(obj4.hashCode());//460141958*/

       /*
     注意: 1.  重写equals原因
        equals: 用于判断当前对象this与指定对象obj是否“相等”
        ①在默认情况下,equals方法的实现等价于与“==”,比较的是对象的地址值
        ②但是我们想要的是当前对象this与指定对象obj是否“相等”,如何解决呢?
        答:重写equals方法
        */
        /*2.重写*/

//          2.1重写equals
        System.out.println(obj1.equals(obj2));//true
        System.out.println(obj1.equals(obj3));//false
        System.out.println(obj2.equals(obj3));//false
        System.out.println(obj4.equals(obj1));//true

        //2.2重写hashCode方法     重写后使hashcode一致
        System.out.println(obj1.hashCode());//105534713
        System.out.println(obj2.hashCode());//105534713
        System.out.println(obj3.hashCode());//105534713
        System.out.println(obj4.hashCode());//105534713

    }

}
(4)hashCode()

public int hashCode():返回每个对象的hash值。

如果重写equals,那么通常会一起重写hashCode()方法,hashCode()方法主要是为了当对象存储到哈希表(后面集合章节学习)等容器中时提高存储和查询性能用的,这是因为关于hashCode有两个常规协定:

  • ①如果两个对象的hash值是不同的,那么这两个对象一定不相等;

  • ②如果两个对象的hash值是相同的,那么这两个对象不一定相等。

  • public class TestHashCode09 {
        public static void main(String[] args) {
    
            HashCode08 obj1=new HashCode08("obj1",18);
            HashCode08 obj2=new HashCode08("obj1",18);
            HashCode08 obj3=obj1;
    
    
            //1.未重写hashCode方法
         /*   System.out.println(obj1.hashCode());//460141958
            System.out.println(obj2.hashCode());//1163157884
            System.out.println(obj3.hashCode());//460141958*/
    
    /*
    如果根据 equals()方法,两个对象是相等的,
    那么对这两个对象中的每个对象调用 hashCode方法都必须生成相同的整数结果;
    而两个hashCode()返回的结果相等,两个对象的equals()方法不一定相等。
    
      */
    
            //2.重写hashCode方法
            System.out.println(obj1.hashCode());//105534713
            System.out.println(obj2.hashCode());//105534713
            System.out.println(obj3.hashCode());//105534713
    
    /*
        注意:
        - ①如果两个对象的hash值是不同的,那么这两个对象一定不相等;
        - ②如果两个对象的hash值是相同的,那么这两个对象不一定相等。
          ( 都是String对象,而且是不同的对象,但是在某种情况下hashcode有可能相等,十进制  位置有限)
      */
            System.out.println("❤❤❤❤❤❤❤❤❤❤❤❤❤❤");
    //   ①如果两个对象的hash值是不同的,那么这两个对象一定不相等;
            System.out.println("hello".hashCode());//  99162322
            System.out.println("kk".hashCode()); //3424
            System.out.println("hello".equals("kk"));//false
            System.out.println("❤❤❤❤❤❤❤❤❤❤❤❤❤❤");
    //    ②如果两个对象的hash值是相同的,那么这两个对象不一定相等。
            System.out.println("Aa".hashCode());//2112
            System.out.println("BB".hashCode());//2112
            System.out.println("Aa".equals("BB"));//false
    
    
        }
    }

    总结:

  • 使用hashCode()来比较两个对象是否相等是不合适的,因为确实存在不同的对象具有相同hashCode值的可能性。这种情况被称为哈希冲突,是哈希表等数据结构必须处理的一种情况。

  • 当你需要比较两个对象是否相等时,应该使用equals()方法而不是hashCode()方法。

  • 如果两个对象根据equals()方法是相等的,那么它们的hashCode()方法应该返回相同的值,这是Java对象的一个基本要求。但是,反过来并不成立:即使两个对象的hashCode()值相同,它们也可能不相等。

  • 所以,在编写Java代码时,如果你重写了equals()方法,通常也应该重写hashCode()方法,以确保它们的行为一致。这样可以确保当两个对象根据equals()方法相等时,它们的哈希码也相同,但是,不要仅仅依赖hashCode()来比较对象的相等性。

(5)finalize() (了解)

protected void finalize():用于最终清理内存的方法

面试题:对finalize()的理解?

  • 当对象被GC确定为要被回收的垃圾,在回收之前由GC帮你调用这个方法,不是由程序员手动调用。

  • 这个方法与C语言的析构函数不同,C语言的析构函数被调用,那么对象一定被销毁,内存被回收,而finalize方法的调用不一定会销毁当前对象,因为可能在finalize()中出现了让当前对象“复活”的代码

  • 每一个对象的finalize方法只会被调用一次。

  • 子类可以选择重写,一般用于彻底释放一些资源对象,而且这些资源对象往往时通过C/C++等代码申请的资源内存

  • (6)重写toString、equals和hashCode方法(Alt+Insert)

    建议使用IDEA中的Alt + Insert快捷键,而不是Ctrl + O快捷键。

    3.标准JavaBean

    JavaBean 是 Java语言编写类的一种标准规范。符合JavaBean 的类,要求:

    (1)类必须是具体的和公共的,

    (2)并且具有无参数的构造方法,

    (3)成员变量私有化,并提供用来操作成员变量的setget 方法。

    (4)重写toString方法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1612620.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

4月21敲一篇猜数字游戏,封装函数,void,无限循环,快去体验体验

今天敲一篇猜数字游戏 目录 今天敲一篇猜数字游戏 1.打开先学goto语句&#xff1a; 2.开干&#xff1a; 首次我们学习随机数&#xff1a; 讲解一下&#xff1a; 改用srand; 加入时间变量&#xff1a; 获取时间&#xff1a;哈​编辑 3.我本来想已近够完美了&#xff0…

HAL STM32 SSI/SPI方式读取MT6701磁编码器获取角度例程

HAL STM32 SSI/SPI方式读取MT6701磁编码器获取角度例程 &#x1f4cd;相关篇《HAL STM32 I2C方式读取MT6701磁编码器获取角度例程》&#x1f4cc;当前最新MT6701数据手册&#xff1a;https://www.magntek.com.cn/upload/MT6701_Rev.1.8.pdf&#x1f4dc;SSI协议读角度&#xff…

企业数字化转型中的五大挑战及应对策略

一、引言 在数字化浪潮席卷全球的今天&#xff0c;数字化转型已成为企业生存和发展的关键所在。然而&#xff0c;尽管众多企业纷纷投身于这一进程&#xff0c;但失败的案例却屡见不鲜。数字化转型失败不仅浪费了企业大量的资源&#xff0c;还可能对企业的声誉和竞争力造成严重…

如何利用pg_dump和pg_restore迁移从一个PostgreSQL服务器到另一个服务器,同时保持一致性与高效性?

文章目录 解决方案1. 使用pg_dump导出数据2. 将导出的数据复制到目标服务器3. 使用pg_restore导入数据保持一致性与高效性的策略一致性高效性 示例代码导出数据复制数据到目标服务器在目标服务器上解压并导入数据 PostgreSQL数据库的迁移是一个常见的任务&#xff0c;特别是在升…

【办公类-21-16】 20240410三级育婴师 344多选题(题目与答案合并word)

作品展示 背景需求&#xff1a; 前文将APP题库里的育婴师题目下载到EXCEL&#xff0c;并进行手动整理【办公类-21-14】 20240406三级育婴师 344道多选题 UIBOT下载整理-CSDN博客文章浏览阅读287次&#xff0c;点赞8次&#xff0c;收藏9次。【办公类-21-14】 20240406三级育婴师…

实现联系人前后端界面,实现分页查询04.15

实现联系人前后端界面&#xff0c;实现分页查询项目包-CSDN博客 项目结构 数据库中建立两个表&#xff1a; 完整的后端目录 建立联系人People表&#xff0c;分组Type表&#xff0c;实现对应实体类 根据需求在mapper中写对应的sql语句 查询所有&#xff0c;删除&#xff0c;添…

OpenVINO安装教程 npm版

从 npm Registry安装 OpenVINO™ 工具套件的英特尔发行版 请注意&#xff1a; 仅提供 JavaScript API 专用于所有主要操作系统的用户&#xff1a;Windows、Linux 和 macOS &#xff08;所有 x86_64 / ARM64 架构&#xff09; macOS 仅支持 CPU 推理 系统要求软件要求 Window…

javaWeb项目-大药房管理系统功能介绍

项目关键技术 开发工具&#xff1a;IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架&#xff1a;ssm、Springboot 前端&#xff1a;Vue、ElementUI 关键技术&#xff1a;springboot、SSM、vue、MYSQL、MAVEN 数据库工具&#xff1a;Navicat、SQLyog 1、Java语言简介 Ja…

模电期末复习(五)集成运算放大电路

集成运算放大电路 5.1 集成放大电路的特点5.2 集成运放的主要技术指标5.3 集成运放的基本组成部分5.3.1 偏置电路5.3.2 差分放大输入级5.3.3 中间级5.3.4 输出级 5.4 集成运放的典型电路5.4.1 双极型集成运放LM741 5.5 各类集成运放的性能特点5.6 集成运放使用中的几个具体问题…

竞逐智能家居大模型:美的“蓄力”,海尔“疾行”

配图来自Canva可画 随着ChatGPT火热出圈&#xff0c;AI大模型便成为了各行各业必争的高地。“BAT”等互联网大厂、华为、小米等通讯巨头&#xff0c;以及一些垂直AI公司&#xff0c;都开始在大模型市场积极布局。众所周知&#xff0c;发展大模型的关键在于应用场景的落地&…

堆的概念、堆的向下调整算法、堆的向上调整算法、堆的基本功能实现

目录 堆的介绍 堆的概念 堆的性质 堆的结构 堆的向下调整算法 基本思想&#xff08;以建小堆为例&#xff09; 代码 堆的向上调整算法 基本思想&#xff08;以建小堆为例&#xff09; 代码 堆功能的实现 堆的初始化 HeapInit 销毁堆 HeapDestroy 打印堆 HeapPrint …

如何在群晖NAS部署office系统办公服务并实现无公网IP远程编辑文件

文章目录 本教程解决的问题是&#xff1a;1. 本地环境配置2. 制作本地分享链接3. 制作公网访问链接4. 公网ip地址访问您的分享相册5. 制作固定公网访问链接 本教程解决的问题是&#xff1a; 1.Word&#xff0c;PPT&#xff0c;Excel等重要文件存在本地环境&#xff0c;如何在编…

Linux 用户和组

理解Linux 用户和组的概念 掌握passwd 文件的组成以及作用 掌握shadow 文件的组成以及作用 了解group 文件的内容 1.用户分类&#xff1a; 超级管理员&#xff08;root&#xff09; 普通用户 程序用户 1.用户信息文件 /etc/passwd 文件中存储了所有用户信息。 1.passwd 格…

2024年大学三下乡社会实践活动投稿——你想知道的都在这里

2024年的夏天,我作为一名大学生,满怀激情地参加了三下乡社会实践活动。在这段难忘的经历中,我深刻体验到了农村生活的艰辛与美好,也收获了许多宝贵的经验和感悟。为了将这段经历传递给更多的人,我决定向媒体投稿,发表一篇关于三下乡社会实践活动的通讯稿件。 起初,我选择了传统…

【多线程】CAS的应用 | CAS的概念 | 实现原子类 | 实现自旋锁

文章目录 一、CAS1.什么是CAS2.实现原子类3.实现自旋锁 一、CAS 1.什么是CAS Compare and swap 比较并交换。 比较交换的是 内存 和 寄存器 比如此时有一个内存 : M。 还有两个寄存器A,B ​ CAS ( M , A , B ) :如果M和A的值相同的话&#xff0c;就把M和B的值进行交换(交换的…

UI设计/交互设计/视觉设计项目汇报/作品集Figma/PPT模板

作为UI设计/交互设计/视觉设计师&#xff0c;创建作品集对于向潜在客户或雇主展示您的技能、创造力和风格至关重要。以下分步指南可帮助您创建令人印象深刻的作品集&#xff1a; 选择您的最佳作品&#xff1a;选择您最强大且最相关的设计项目&#xff0c;将其纳入您的作品集。…

Pytorch入门实战: 06-VGG-16算法-Pytorch实现人脸识别

第P6周&#xff1a;VGG-16算法-Pytorch实现人脸识别 &#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客 &#x1f356; 原作者&#xff1a;K同学啊 &#x1f3e1; 我的环境&#xff1a; 语言环境&#xff1a;Python3.8 编译器&#xff1a;Jupyter La…

微信小程序vue.js+uniapp服装商城销售管理系统nodejs-java

本技术是java平台的开源应用框架&#xff0c;其目的是简化Sping的初始搭建和开发过程。默认配置了很多框架的使用方式&#xff0c;自动加载Jar包&#xff0c;为了让用户尽可能快的跑起来spring应用程序。 SpinrgBoot的主要优点有&#xff1a; 1、为所有spring开发提供了一个更快…

python3--lxml pytoml.core.TomlError expected_equals报错解决

文章目录 一、问题二. 解决方法&#xff1a;三. 参考&#xff1a;四. 总结 一、问题 在ubuntu的armbian上的python3中安装lxml时报错了 安装命令是 pip3 install lxml报错简略信息如下图 File "/usr/share/python-wheels/pytoml-0.1.2-py2.py3-none-any.whl/pytoml/par…

iptables命令简介

正文共&#xff1a;3456 字 22 图&#xff0c;预估阅读时间&#xff1a;3 分钟 iptables/ip6tables命令&#xff0c;用于在Linux内核中设置、维护和检查IPv4和IPv6数据包过滤规则的表&#xff0c;从而实现IPv4/IPv6数据包过滤和NAT的管理工具。它可以定义多个不同的表&#xff…