Object类与内部类

news2025/3/11 9:14:26

废话不多说,直接进入正题。

目录

一、Object类

1.介绍Object类

2.toString方法

3.equals方法

4.hashCode方法

二、内部类

1.静态内部类

2.实例内部类

3.匿名内部类

4.局部内部类


一、Object类

1.介绍Object类

(1)Object类就是所有类的父类/超类,也称为祖先类。也就是说所有的类都会默认继承于Object类,即使你没有定义继承关系

(2)Object类具有的方法

1)在本文中,我们重点介绍三个方法:toString()、equal()、hashCode()

2)因为Object类是所有类的父类,所以我们创造的任何类,都可以直接使用上面的方法,也可以重写上述的方法(当然,构造方法除外)

下面介绍三个常用的重写方法

2.toString方法

(1)不重写打印自定义类型对象时

可见,打印出来的是一堆乱码。

(2)了解打印方法的背后执行流程

这也就是为什么直接打印,会得出一些看不懂的数据。要想改变结果,就需要重写父类的toString()方法。

(3)重写方法

class Person {
    public String name = "张三";
    public int age = 10;

    @Override
    public String toString() {
        return "名字:"+name+" 年龄:"+age;
    }
}
public class Test1 {
    public static void main(String[] args) {
        Person person = new Person();
        System.out.println(person);
    }
}

打印结果:

当子类重写了toString方法后,最终打印时,调用的toString()方法也就是重写的方法。

(4)使用编译器生成

第一步:右键鼠标或者Alt + Lnsert,并且点击Generate…

第二步:点击toString()

第三步:勾选。当只有一个被选择的时候,按住ctrl再进行勾选即可

生成的结果展示:

小结:当我们想打印自定义类型中的数据,并且打印的结果并非目标值时,可以重新toString()方法。简易记忆法:System.out.println()方法最终调用的是toString()方法

3.equals方法

该方法用于比较两个对象是否相等(相同),但是不能比较两个对象的大小关系

3.1.介绍方法背景

(1)两个普通变量比较是否相等

结果是明显的,是我们所想要的。

这也是我们所想要的 

(2)比较两个实例对象时

结果大失所望

(3)再比较自定义类型对象时

结果仍是大失所望,这里的原因是:复杂类型和引用类型不能使用==进行比较是否相等,因为==比较的是他们的地址是否相等,很显然,new出来的对象地址是不会相等的。但是前面简单的变量和字符串却可以,因为他们的地址一样。

(4)使用equals方法比较

啊?不是说equals方法是用来比较两个对象是否相同的吗?为什么结果还是不对?这就是下面想要介绍的了

3.2.查看equals方法执行过程

(1)方法背后调用

当我们以为equals方法底层很厉害的时候,点开却发现,底层也是使用==比较,难怪说比较的使用和预期不一样。

(2)这样设置的原因是编译器也不知道程序员想要比较的对象是什么。如果是复杂类型对象,像上面的Son,是比较名字是否相等呢?还是比较年龄是否相等呢?

3.3.重新equals方法

(1)自定义写

自定义的比较规则:先查看其中一个对象是否为null,再比较名字是否相同,最后比较年龄。如果三者全部一样,则可以认为是同一个人,也就是两个对象相同。

 运行结果:结果就是预期,很正确

上述的几点解释:第一点:使用参数时,需要先向下转型,因为父类对象无法访问到子类对象的成员;第二点:不是说重新equals方法吗?怎么还调用equals方法比较?原因是当String类原码重写了equals方法,当String类型去调用时,可以正确的。

2)String类型重写equals方法

这样比较时,结果也是正常的

3)查看String类重写的equals方法

不用去理解重写是如何实现的,只需要记住,如果是String类型,可以直接调用equals方法。

(2)编译器生成

和上面生成toString()方法差不多 

1)第一步

2)第二步

3)按照默认选项,一直next下去即可

 

4)结果

equals方法和hashCode()方法一起生成的,如果不需要再直接删除hashCode()方法即可

 

4.hashCode方法

这个方法的作用是比较两个对象在内存中存储的位置是否相同。比如两个对象内容一样,就可以认为是同一个对象,也就应该存放在同一块内存空间上面。

 拿下面的例子举例

(1)未重写时

(2)重写后

本文的hashCode()方法就介绍这么多,后续在数据结构的哈希表中还有用处(hashCode的重点用法)

二、内部类

        内部类介绍,通常的来说,就是在一个类的内部再定义一个类,作为外部类的一个成员。内部类的定义方式和之前介绍过的组合写法类似。

1.静态内部类

(1)语法格式

static class 类名 {}

(2)定义静态内部类

class Outer {
    public int data1 = 1;
    public int data2 = 2;
    public static int data3 = 3;

    //定义静态内部类
    static class Inter {
        public int data4 = 4;
        public static int data5 = 5;
        public void func() {
            System.out.println("我是静态内部类的方法~");
        }
        public Inter() {
            System.out.println("我是静态内部类的构造方法!");
        }
    }
    public void func() {
        System.out.println("我是外部类的方法~");
    }

}

由此可见,静态内部类中也可以有自己的成员变量、成员方法和构造方法,而且方法名与变量名可以与外部类的名字相同。

(3)静态内部类的访问方式

时刻牢记,内部类也是属于外部类的一个成员。

实例化静态内部类对象:

访问成员和方法:

使用静态内部类的引用,是无法访问到外部类的任何成员的。

(4)在静态内部类中访问外部类

这样操作可以发现,在静态内部类中,可以直接访问外部内的静态成员,非静态不可以直接访问。

非静态成员则需要通过对象的引用来访问。同样,访问方法的方式和访问成员变量一样,这里不再过多介绍。

(5)静态内部类的优点和注意事项

优点:访问静态内部类对象不需要创造外部类对象,因为这样的优点,该内部类后续用的场景较多。

注意事项:

1)在静态内部类中只能访问外部类中的静态成员;如果需要访问,则需要先在内部类中创造外部类对象,使用对象的引用进行访问。

2)不使用外部类对象的引用访问 内部类和外部类名字相同的成员时(静态成员与方法),会优先访问静态内部类的

2.实例内部类

实例内部内的定义位置和静态内部类类似,但是定义的格式少了static关键字

(1)语法格式

class 类名 {}

(2)定义实例内部类

(3)定义实例内部类对象

像静态内部类的形式创造对象,结果是得到一场串的波浪号。很明显,创建实例内部类的对象并不能如此。

第一种:先创建外部类对象,再使用和实例静态内部类的方式去创建。究其原因是实例内部类是属于对象的,创造实例内部类时,就需要通过外部类对象的引用;而静态内部类不属于外部类对象,进而不用创造外部类对象

第二种方式:这样的写法就是第一种写法的合并,但是看起来比较丑陋

(4)使用内部类对象引用访问成员

实例内部类对象的引用也只能访问内部类中的成员,而不能访问外部类的成员

(5)内部类中访问外部类

在实例内部类中,可以访问外部类的所有成员方法和成员变量,包括静态的和非静态的。

(6)注意事项

1)外部类中的任何成员都可以在实例内部类方法中直接访问
2)实例内部类所处的位置与外部类成员位置相同,因此也受 public private 等访问限定符的约束
3)在实例内部类方法中访问同名的成员时,优先访问自己的,如果要访问外部类同名的成员,必须:外部类名称.this. 同名成员 来访问
4) 实例内部类对象必须在先有外部类对象前提下才能创建
5) 实例内部类的非静态方法中包含了一个指向外部类对象的引用
6) 外部类中,不能直接访问实例内部类中的成员,如果要访问必须先要创建内部类的对象。

3.匿名内部类

匿名内部类的应用场景大多数在对于接口的实现或者类的继承中,主要场景还是应用于对接口的实现中。

(1)匿名内部类简介

1)为什么匿名?因为该类实现了接口之后,是没有名字,不同于普通类实现接口(例如:普通类A是实现了接口B,此时A就是类名,是有名字的)

2)为什么是内部类?其实匿名内部类是局部内部类的一种,而且创造此类是必须要存在于一个类的方法中(一般是main函数中,而main函数要存在于一个类中)

3)使用目的:为了使用接口中的方法,本质上会发生向上转型

(2)匿名内部类定义

第一种创造方式:不使用引用(一次性对象)

interface Inter {
    void func();
}
public class Test3 {

    public static void main(String[] args) {

        new Inter() {
            @Override
            public void func() {
                System.out.println("我是重写的方法");
            }
        }.func();
    }
}

匿名内部类实现了接口,并且重新了接口中的方法,然后使用该类调用了该接口中的方法

与普通类实现接口的对比:

两种方式的对比,很明显,第一种的方式很方便

 

第二种创建方式:给匿名内部类对象加上引用

这其实也是一种向上转型,并且发生了动态绑定。父类(接口)类型 引用了 子类(匿名内部类)对象,通过父类引用调用了子类重写的方法,最终会绑定到子类上。

与普通类的对比:

普通类可以使用两种类型的引用去接收该对象,原因是普通类的名字我是是可以知晓的,所以可以使用普通类的引用去接收,但是匿名内部类不行,他没有名字。

以上就是匿名内部类的定义和使用

(3)匿名内部类的注意事项

1)

2)匿名内部类中不能有构造方法

3)匿名内部类中不能有静态方法和变量

4.局部内部类

上面的匿名内部类就是局部内部类的代表,定义在方法中。局部内部类使用的场景非常的少。

(1)定义局部内部

(2)实例化局部内部类对象

由此可见,局部内部类是非常不方便的,典型的吃力不讨好,所以后续的使用场景非常的少。

以上就是本文的全部内容了

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

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

相关文章

算法学习——LeetCode力扣补充篇6(132. 分割回文串 II、673. 最长递增子序列的个数、841. 钥匙和房间、463. 岛屿的周长)

算法学习——LeetCode力扣补充篇6 132. 分割回文串 II 132. 分割回文串 II - 力扣(LeetCode) 描述 给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 。 返回符合要求的 最少分割次数 。 示例 示例 1&#…

一文了解低功耗蓝牙BLE

低功耗蓝牙技术可以构建两种类型的设备:双模设备和单模设备。双模设备既支持经典蓝牙又支持低功耗蓝牙。单模设备只支持低功耗蓝牙。还有仅支持经典蓝牙的设备。 在链路层,设备被分为广播者、扫描者、从设备和主设备。广播者是传输数据包的设备,扫描者是接收广播者的数据包…

ids工业相机与电控位移台同步控制及数据采集

通过VS2017和OpenCV,实现ids工业相机与电控位移台同步控制及数据采集 目录项目环境配置代码流程及思路项目架构项目开发运行效果开发关键ids相机配置位移台环境配置相机头文件相机参数设置保存图像函数设置电控位移台头文件电控位移台设置参数最后就是通过main函数进行调用和控…

美易官方:华尔街分析师最青睐的股票过去五年表现怎么样

华尔街分析师一直被视为金融市场的风向标,他们的推荐和预测往往能影响投资者的决策。然而,分析师的预测并不总是准确无误的,特别是在变幻莫测的股市中。那么,我们不禁要问,华尔街分析师最青睐的股票在过去五年中的表现…

OpenHarmony实战:小型系统移植概述

驱动主要包含两部分,平台驱动和器件驱动。平台驱动主要包括通常在SOC内的GPIO、I2C、SPI等;器件驱动则主要包含通常在SOC外的器件,如 LCD、TP、WLAN等 图1 OpenHarmony 驱动分类 HDF驱动被设计为可以跨OS使用的驱动程序,HDF驱动框…

单总线及DS18B20

目录 单总线 单总线介绍 单总线的电路规范 单总线时序结构 初始化 代码理解 发送一位 代码理解 接收一位 代码理解 发送一个字节 代码理解 接收一个字节 代码理解 DS18B20 DS18B20介绍 引脚及应用电路 内部结构 存储器结构 DS18B20操作流程 ROM指令 功能…

大厂面试之【Redis持久化机制】 - RDB和AOF概述及应用配置

文章目录 Redis持久化1. RDB(Redis DataBase)1.1 概述1.2 配置应用 2. AOF(Append Only File)2.1 概述2.2 配置应用 Redis持久化 先上结论:Redis持久化操作分为rdb以及aof,但是前者已经够用 1. RDB(Redis DataBase) 1.1 概述 rdb保存的是dump.rdb文件在指…

基于springboot实现校园资料分享平台系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现校园资料分享平台演示 摘要 随着信息互联网购物的飞速发展,国内放开了自媒体的政策,一般企业都开始开发属于自己内容分发平台的网站。本文介绍了校园资料分享平台的开发全过程。通过分析企业对于校园资料分享平台的需求,创…

C++ 11是如何封装Thread库的?

引言 C11 标准引入了一个重要的特性,即原生线程支持,这标志着C语言在并发编程领域迈出了坚实的步伐。在此之前,开发人员在进行跨平台的多线程编程时,不得不依赖于操作系统提供的特定API,如Windows API或POSIX Threads…

开发环境->生产环境

1、数据迁移 不涉及docker # 以数据库用户导出数据 mysqldump -h 192.168.1.168 -P 3307 -u abragent -pabragebb17 abragent > abragent.sql# 以root用户导出数据 mysqldump -h 192.168.1.168 -P 3307 -u root -p8d3Ba1b abragent > abragent.sql 涉及docker …

Android12 简单的共享内存驱动实现 参考Ashmem

Android12 共享内存驱动实现 SOC:RK3568 system:Android12 概述: 1. 概述 Ashmem(Anonymous Shared Memory,Android 匿名共享内存),它基于 mmap 系统调用,可以让不同进程将同一段…

数据恢复工具哪个成功率高?十大数据恢复软件榜单

数据恢复软件可以恢复损坏或删除的数据。使用数据恢复软件恢复存储在安全位置的剩余信息。您可能会因意外删除文件、文件系统逻辑损坏甚至存储故障等各种原因而丢失数据。执行查看、复制、扫描、识别或提取存储设备中已删除扇区的数据等操作。恢复虚拟存储在任何设备&#xff0…

【算法练习】27:冒泡排序学习笔记

一、冒泡排序的算法思想 原理:以升序为例,冒泡排序通过从左往右连续比较相邻元素,当发现左边比右边大就交换元素。从左往右依次比较完称为“一轮”,每轮结束之后就会固定一个元素。 时间复杂度:2层循环,所以…

windows安装Openssl

openssl官网:[ Downloads ] - /source/index.html Windows 安装方法 OpenSSL 官网没有提供 Windows 版本的安装包,可以选择其他开源平台提供的工具 Win32/Win64 OpenSSL Installer for Windows - Shining Light Productions 等待下载完成 捐不起 配置环境变量 ope…

Maven依赖管理项目构建工具

一 Maven简介 1.1、Maven是一个依赖管理工具 1.1.1 jar 包的规模 随着我们使用越来越多的框架,或者框架封装程度越来越高,项目中使用的jar包也越来越多。项目中,一个模块里面用到上百个jar包是非常正常的。 比如下面的例子,我…

内存管理机制SLAB

1. 为什么需要内存分配管理?为什么需要SLAB? 在学习c语言时,我们常常会使用到malloc()去申请一块内存空间,用于存放我们的数据,这是代码层面的语言 如果我们想要关心malloc这个命令向系统发出后,系统会做什…

HTMLCSSJS

HTML基本结构 <html><head><title>标题</title></head><body>页面内容</body> </html> html是一棵DOM树, html是根标签, head和body是兄弟标签, body包括内容相关, head包含对内容的编写相关, title 与标题有关.类似html这种…

cdp集群扩容节点磁盘挂载失败原因和解决办法

问题说明 之前在对cdp集群扩容节点环境配置时 按照文档挂载磁盘 在最后一步挂载时&#xff0c;发现有块磁盘没挂载上去 可以看到本该挂载到/data5目录的磁盘sdf1被挂到了/data1上面 查看挂载点文件 vim /etc/fstab问题分析&#xff1a; 发现之前在设置挂载点的时候挂载目录…

gpt4.0中文版

我愿把这个网站成为全球最强AI网站&#xff01;弄100多个AI伺候你&#xff1f;&#xff1f; 家人们&#xff0c;你们猜我发现了什么牛逼的AI网站&#xff1f;&#xff1f; 直接上图&#xff1a; 编辑 这个网站&#xff0c;聚合了国内外100多个顶尖的AI&#xff0c;包括了Op…

AI技术在金融领域/银行业的应用和风险

前言 随着科技的不断发展&#xff0c;人工智能&#xff08;AI&#xff09;技术已经在各行各业得到了广泛的应用&#xff0c;其中包括银行业。银行业作为经济的重要组成部分&#xff0c;一直在不断地探索和应用新技术&#xff0c;以提升服务效率、风险管理和客户体验。然而&…