Java- Object根父类

在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方法

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【硬十宝典】——1.4【基础知识】电源完整性——理解与设计

定义&#xff1a; 电源完整性&#xff08;Power integrity&#xff09;简称PI&#xff0c;是确认电源来源及目的端的电压及电流是否符合需求。 电源完整性在现今的电子产品中相当重要。有几个有关电源完整性的层面&#xff1a;芯片层面、芯片封装层面、电路板层面及系统层面。…

18-Echarts 配置系列之:数据集 dataset

简介&#xff1a; 数据集&#xff08;dataset&#xff09;是专门用来管理数据的组件。简化在每一个系列中设置数据&#xff0c;这一个配置是在Echarts4 中开始支持。 通过数据集配置&#xff0c;避免为每一个系列创建一个数据&#xff0c;避免格式转化的痛苦。 简单举例&…

开启智慧之旅,AI与机器学习驱动的微服务设计模式探索

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 &#x1f680; 转载自热榜文章&#x1f525;&#xff1a;探索设计模式的魅力&#xff1a;开启智慧…

2024年腾讯云免费服务器最新申请入口链接

腾讯云免费服务器申请入口 txybk.com/go/free 免费服务器可选轻量应用服务器和云服务器CVM&#xff0c;轻量配置可选2核2G3M、2核8G7M和4核8G12M&#xff0c;CVM云服务器可选2核2G3M和2核4G3M配置&#xff0c;腾讯云百科txybk.com分享2024年最新腾讯云免费服务器申请入口、限制…

YOLOv8操作指南-下载+配置环境

下载&#xff1a;github&#xff0c;进入搜索YOLOv8 就这个&#xff0c;点开 下载就可以了&#xff0c;然后解压一下 配置环境&#xff1a; 安装Pytorch 先看一下这个&#xff1a; 如果电脑有GPU的话&#xff1a; 判断自己电脑GPU&#xff1a;打开任务管理器 我的是英伟达3…

sherpa + ncnn 离线语音识别

目录结构 前言音视频格式转为wavsherpa-ncnn编译LinuxWindowswindows编译中遇到的问题问题“nmake -? failed with: no such file or directory”编译失败原因 成功编译截图 可执行程序说明模型下载语言识别测试LinuxWindows 参考文献 前言 小编需要实现离线音视频语言部分识…

vulfocus靶场couchdb 权限绕过 (CVE-2017-12635)

Apache CouchDB是一个开源数据库&#xff0c;专注于易用性和成为"完全拥抱web的数据库"。它是一个使用JSON作为存储格式&#xff0c;JavaScript作为查询语言&#xff0c;MapReduce和HTTP作为API的NoSQL数据库。应用广泛&#xff0c;如BBC用在其动态内容展示平台&…

完结撒花! java算法day60 | 84.柱状图中最大的矩形

84.柱状图中最大的矩形 思路&#xff1a; 这道题和接雨水很像&#xff0c;不过有两点差别&#xff1a; 这道题需要找到一个位置前一个比他小的数和后一个比他小的数&#xff0c;而接雨水是找到前一个和后一个比他大的数。需要在原数组前后各补上0&#xff0c;防止忽略一些边缘…

Excel数据处理:高级筛选、查找定位、查找函数(VLOOKUP)

高级筛选 先去选中筛选区域 如果筛选的条件在同一行那么就是且的关系 如果筛选的条件不在同一行那么就是或的关系 查找定位空值 使用VLOOKUP函数

C语言中, 文件包含处理,#include< > 与 #include ““的区别

文件包含处理 指一个源文件可以将另外一个文件的全部内容包含进来 &#xff23;语言提供了#include命令用来实现文件包含的操作 #include< > 与 #include ""的区别 <> 表示系统直接按系统指定的目录检索 "" 表示系统先在 "" 指定…

PACS/RIS影像管理系统源码,医院影像科室PACS系统源码,三维医学影像系统源码 支持图像后处理与重建

PACS/RIS影像管理系统源码&#xff0c;支持图像后处理与重建 医院影像科室PACS系统源码&#xff0c;三维医学影像系统源码 PACS&#xff0c;全称为Picture Archiving and Communication Systems&#xff0c;中文意思是医学影像存档与通讯系统。它主要是应用在医院影像科室中&a…

java算法day4

删除链表的倒数第N个结点链表相交环形链表 删除链表的倒数第N个结点 解法&#xff1a;双指针&#xff08;快慢指针&#xff09; 首先一定要有删除结点的思想。所以这个题是用虚拟头结点比较方便。 先上模拟图&#xff0c;然后看流程&#xff1a; 这里后移根据不同的想法有不同…

java优先级队列(堆)详解

一、优先级概念 什么是优先级&#xff1a;比如女士优先&#xff0c;个子低的优先排到前面去&#xff0c;有一部分数据具备优先级&#xff0c;要以优先级的顺序将顺序存储起来。 前面介绍过队列&#xff0c;队列是一种先进先出(FIFO)的数据结构&#xff0c;但有些情况下&#…

OceanBase开发者大会2023届视频及PPT汇总

数据库技术趋势 我眼中的数据库技术 阳振坤OceanBase 首席科学家 观看视频 下载 PDF 未来&#xff0c;中国需要什么样的数据库&#xff1f; 周傲英华东师范大学副校长&#xff0c;CCF 会士 观看视频 下载 PDF 云原生技术趋势解读 Keith ChanCNCF 云原生计算基金会中国区总监 …

开发工具的使用

IDEA的安装与使用&常用快捷键 文章目录 IDEA的安装与使用&常用快捷键一、认识IntelliJ IDEA二、IDEA 的下载&卸载三、IEAD相关设置3.1 JDK的相关设置3.2 系统设置&#xff08;启动项/自动更新&#xff09;3.3 设置整体主题&#xff08;主题/字体/背景&#xff09;3…

Linux--链表 第二十五天

1. 链表 t1.next -> data t1.next->next->data .(点号)的优先级比->的大 所以 t1.next->data 就可以了 不用(t1.next)->data 2. 链表的静态增加和动态遍历 打印链表算法&#xff0c; void printLink(struct Test *head) { struct Te…

如何做一个优秀的系统工程师?

一、背景 做好一个优秀系统工程师的关键在于其在产品开发生命周期中对需求分析的有效把握与运用&#xff0c;这个过程直接影响到系统的整体架构设计、规格参数的明确设定以及业务流程的深度挖掘与优化。需求分析不仅是理解用户实际问题的核心环节&#xff0c;更是界定系统开发…

Java基础之JVM对象内存分配机制简介

一 对象内存分配 1.1 运行时数据区域 1.2 常见java应用启动JVM参数&#xff1a; -Xss&#xff1a;每个线程的栈大小(单位kb)-Xms&#xff1a;堆的初始大小&#xff0c;默认物理内存的1/64,示例&#xff1a;-Xms:4g -Xms:10m-Xmx&#xff1a;堆的最大可用大小&#xff0c;默认物…

LeetCode 热题 100 题解:普通数组部分

文章目录 题目一&#xff1a;最大子数组和&#xff08;No. 53&#xff09;题解 题目二&#xff1a;合并区间&#xff08;No. 56&#xff09;题解 题目三&#xff1a;轮转数组&#xff08;No. 189&#xff09;题解 题目四&#xff1a;除自身以外数组的乘积&#xff08;No. 238&a…

springSecurity用户认证和授权

一&#xff0c;框架介绍 Spring 是一个非常流行和成功的 Java 应用开发框架。Spring Security 基于 Spring 框架&#xff0c;提供了一套 Web 应用安全性的完整解决方案。一般来说&#xff0c;Web 应用的安全性包括用户认证&#xff08;Authentication&#xff09;和用户授权&am…