内部类(来自类和对象的补充)

  ❤️❤️前言~🥳🎉🎉🎉

hellohello~,大家好💕💕,这里是E绵绵呀✋✋ ,如果觉得这篇文章还不错的话还请点赞❤️❤️收藏💞 💞 关注💥💥,如果发现这篇文章有问题的话,欢迎各位评论留言指正,大家一起加油!一起chin up!👍👍 

💥个人主页:E绵绵的博客
💥所属专栏:JAVASE题目练习  JAVASE知识点专栏  c语言知识点专栏   c语言题目练习

之前我们在讲类和对象时就提到过内部类,不过当时说了等讲完抽象类和接口再讲这个,现在兑现诺言的时候到了,那我们开始内部类的学习吧!

内部类 

❤️❤️内部类是指在一个类的内部定义的另一个类。内部类可以访问外部类的所有成员,包括私有成员。内部类提供了一种封装和组织代码的方式,可以将相关的类和接口放在一起,增加代码的可读性和可维护性。

分为以下四种:

实例(成员)内部类,静态内部类,局部(方法)内部类,匿名内部类。

内部类虽然在外部类里面,但是它编译时内部类会形成单独的字节码文件

实例内部类

❤️❤️实例内部类的成员变量和成员方法都不能用static修饰。

但存在一个特殊的点:实例内部类中的成员变量也可以用static修饰,只不过那必须加上final修饰使其变为常量才可以用static修饰。

 ❤️❤️我们要清楚虽然内部类在外部类里面,但实例化外部类并不会同时实例出内部类,所以当实例出外部类后,内部类需要我们主动实例化。

所以实例内部类的实例化需要先创建外部类的实例,然后再通过外部类的实例来创建实例内部类的对象。

例如,如果外部类是Outer,实例内部类是Inner,那么可以通过Outer outer = new Outer(); Outer.Inner inner = outer.new Inner(); 来实例化实例内部类.

当然还有另外一种方式也可以实例化实例内部类:Outer.Inner inner=new Outer().new lnner(); 

 ❤️❤️在实例内部类中我们可以访问外部类的所有成员,包括私有成员。具体细节如下:

1. 🎯🎯当外部类和内部类成员不同名时,我们可以在实例内部类中直接使用外部类的成员变量和成员方法,无需前面还要引用:

 

在上图中InnerClass是实例内部类,我们在该内部类中直接使用了外部类中的成员变量a,但切记注意这里的a前面不能带this,如果带了this就表示这是内部类中的a,但我们内部类中不存在同名的a,所以报错。不带this直接用a时因为内部类没a所以就表示这是外部类中的a。

成员方法跟成员变量同理。

2. 🎯🎯而当内部类和外部类存在同名的成员变量时,内部类直接使用它时会优先选择自己的成员变量。如下:

此时就因为a同名导致直接使用a时优先选择内部类中的a,所以a和this.a都表示内部类中的a,而如果我们硬要使用外部类中的a时,就可以用 外部类的类名.this.a如OutClass.this.a表示这是外部类的a(注意这是特定的语法规则,我也不知道为什么用这样的格式能表示出外部类).

成员方法跟成员变量同理

❤️❤️而在外部类中我们不能直接访问实例内部类的成员,需要通过创建实例内部类的对象再引用访问。(这个懂得都懂,就不多讲了)

❤️❤️除此之外,到了其他类中我们用内部类对象引用就只能引用其内部方法和变量(不能引用外部类的)

用外部类对象引用也只能引用其方法和变量(不能引用内部类的)

❤️❤️下面我们再看下文案,防止你们没看懂:

  

静态内部类

❤️❤️我们现在说一下静态内部类跟实例内部类不同的点吧:

🎯🎯1.静态内部类可以有静态方法和变量,也可以有实例方法和变量。 

🎯​​​​​​​🎯2.静态内部类的创建不依赖于外部类的实例对象,可以直接通过外部类名创建。

如 OutClass.InnerClass innerClass = new OutClass.InnerClass();(OutClass为外部类,InnerClass为内部类)。

所以因为静态内部类的创建不需要先创建外部类,我们往往用静态内部类比实例内部类多一点。

🎯​​​​​​​🎯3. 静态内部类可以直接访问外部类的静态成员,但不能直接访问外部类的非静态成员。如果需要访问外部类的非静态成员,可以通过在内部类中创建外部类的对象来实现。

如添加OutClass  outclass=new  OutClass();而后将在内部类中且原本来自外部类的实例变量和实例方法前加上outclass.   就可以了。

❤️❤️所以这就是静态内部类跟实例内部类的不同,其他的它们两基本都相同,所以我们了解了这些不同点就可以了。

局部内部类 

❤️❤️定义在外部类的方法体中,该种内部类只能在其定义的位置使用,一般使用的非常少,此处简单了解下语法格式。不过多了解。

所以对于局部内部类它只能在外部类的某个方法体内使用,使用性很有限。

❤️❤️【注意事项】

1. 局部内部类只能在所定义的方法体内部使用

2. 不能被public、static等修饰符修饰

3. 编译器也有自己独立的字节码文件,命名格式:外部类名字$数字内部类名字.class

4. 几乎不会使用,所以我们不必过多了解  

 匿名内部类

🎯​​​​​​​🎯匿名内部类是指在使用时才定义并同时实例化的内部类,没有显式的类名。其语法格式如下:

​
接口 类名 = new 接口() {
    // 匿名内部类的成员变量和方法
};

​

注意实施该接口的类被隐藏了,没有显示出来(以及implements也没显示出来),我们new是对隐藏的该类进行实例化。对于该种格式它是特有的,所以我们只需要记住就行。

下面直接看匿名内部类的使用:

public class Main {
    public static void main(String[] args) {
        // 创建一个接口对象,并实现其方法
        MyInterface myInterface = new MyInterface() {
            @Override
            public void doSomething() {
                System.out.println("匿名内部类实现的方法");
            }
        };
        
        // 调用接口方法
        myInterface.doSomething();
    }
}

// 定义一个接口
interface MyInterface {
    void doSomething();
}

所以这就是匿名内部类的使用,之后当学到线程时我们会经常接触这种语法的。

总结 

所以我们内部类就结束啦,内部类结束我们的类与对象才算真正的结束。之后将给大家把之前学的知识点总结起来写一个小项目。还请各位铁汁们给作者点一个小小的关注,评评论呀,感谢各位大佬~❤️❤️🥳🎉🎉🎉!

 

 

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

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

相关文章

SON序列化解决方案

JSON(JavaScript Object Notation)是一种用于数据交换的轻量级数据格式。在我们日常Python编程中,通常可以使用内置的json模块来进行JSON序列化和反序列化。那么关于使用json模块进行JSON序列化和反序列化的问题解决方案,可以参考…

了解以太坊虚拟机(EVM)

了解以太坊虚拟机(EVM) 以太坊虚拟机(Ethereum Virtual Machine,简称EVM)是以太坊网络的核心组件之一,它承担着智能合约执行的重要任务 特点 智能合约执行环境:EVM提供了一个安全的环境&#xf…

mysql 运算符 语句 字符集 校队集

mysql 运算符 使用select语句可以输出运算的结果 mysql标识符不区分大小写 算数运算符 1./除法 得到的结果是一个小数 %是整数,省略小数 2、除以0不会报错,得到的结果是 null 3.数宇和字符串做加法运算,并不会拼接 比较运算符 1.mysql里面的=是比较运算符,而不是赋值运算…

电工技术学习笔记——直流电路及其分析方法

一、直流电路 电路的组成 1. 电压和电流的参考方向 电压(Voltage):电压是电场力对电荷产生的作用,表示为电荷单位正电荷所具有的能量。在电路中,电压通常被定义为两点之间的电势差,具有方向性,…

(免费分享)基于springboot,vue房屋租赁管理系统

功能说明: * 普通用户角色: 1. 寻找房源功能--提供了两种寻找房源的功能,一种是普通用户在平台上搜索、筛选主动寻找房源的功能,另一种是用户填写征集房源的条件,系统会持续将最新符合条件的房源推送给用户。 2. …

【HBase】

什么是HBase HBase是Google Bigtable的开源实现,类似Google Bigtable利用GFS作为其文件存储系统,HBase利用Hadoop HDFS作为其文件存储系统;Google运行MapReduce来处理Bigtable中的海量数据,HBase同样利用Hadoop MapReduce来处理HBase中的海量数据。 访问层次(数据…

mac电脑安装redis教程

1、下载地址 Download | RedisRedisYou can download the last Redis source files here. For additional options, see the Redis downloads section below.Stable (7.2)Redis 7.2 …https://redis.io/download/#redis-downloads 2、安装 2.1 解压下载后的压缩文件 2.2 进入…

Redis数据库:持久化策略与性能管理

目录 前言 一、Redis持久化 1、Redis持久化功能 2、Redis持久化的两种方式 3、RDB持久化 3.1 触发条件 3.2 执行流程 3.3 启动时加载 4、AOF持久化 4.1 开启AOF 4.2 执行流程 4.2.1 执行流程详解 4.2.2 执行流程图 4.3 启动时加载 5、RDB与AOF持久化的优缺点 5…

【STM32】ST-LINK 下载时遇到的问题

如果出现“ST-Link USB communication error”ST-Link USB通信错误,则需要启动STM32 ST-LINK Utility,点击【ST-LINK】->【Firmaware】更新固件,然后打开Kei,点击魔术棒->->Debug->Settings,开到出现类似“…

2023年CSP-J第一轮题目讲解

大家好,我是极风。由于当年的初赛考的很差(没考过70分),所以现在打算拿出来再细看一下。 一、 单项选择题(共15题,每题2分,共计30分:每题有且仅有一个正确选项) 1. 在…

2024.04.04 健身打卡第 45 天

别让别人告诉你,你成不了才,如果你有梦想的话就要去捍卫它,那些一事无成的人,想告诉你你也成不了大器,如果你有理想的话,就要去努力实现。 2024.04.04 健身打卡第 45 天

电商系列之促销

> 插:AI时代,程序员或多或少要了解些人工智能,前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 坚持不懈,越努力越幸运,大家…

[实验报告]--基于端口安全

[实验报告] 目录 [实验报告] 一、项目背景 二、实验环境 三、项目规划设计 四、项目实施 五、验证项目成果 基于端口安全的 Jan16 公司网络组建 一、项目背景 Jan16 公司开发部为重要部门,所有员工使用指定的计算机工作,为防止员工或访客使 用个…

蓝桥杯真题:七段码

import java.util.Scanner; import java.util.ArrayList; // 1:无需package // 2: 类名必须Main, 不可修改public class Main {public static void main(String[] args){// 连接关系图int[][] map new int[][]{{0, 1, 0, 0, 0, 1, 0},{1, 0, 1, 0, 0, 0, 1},{0, 1, 0, 1, 0, 0…

如何保护IP地址不被泄露?

当互联网成为每个家庭的重要组成部分后,IP地址就成了你的虚拟地址。您的请求从该地址开始,然后 Internet 将消息发送回该地址。那么,您担心您的地址被泄露吗? 对于安全意识高或者某些业务需求的用户,如果您正在寻找保护…

数据结构——图的概念,图的存储结构,图的遍历(dfs,bfs)

目录 1.图的定义和术语 2.案例引入 1.六度空间理论 3.图的类型定义 4.图的存储结构 1.邻接矩阵 1.无向图的邻接矩阵表示法 2.有向图的邻接矩阵表示法 3.网(有权图)的邻接矩阵表示法 代码示例: 2.采用邻接矩阵表示法创建无向图…

SSM学习——Spring JDBC

Spring JDBC 概念 Spring的JDBC模块负责数据库资源管理和错误处理,简化了开发人员对数据库的操作。 Spring JDBC通过配置数据源和JDBC模板来配置。 针对数据库操作,Spring框架提供了JdbcTemplate类,它是Spring框架数据抽象层的基础&#…

基因组de novo组装

分以下几个部分: CLR组装 HIFI组装 ONT组装 二、三代数据矫正 组装结果评估 一、CLR组装 下机数据: 主要用那个bam文件 软件:wtdbg2 第一步:bam转fasta文件 参考:https://www.jianshu.com/p/03c7eb11102d # 进行基…

kali 渗透工具 - mestaploit

永恒之蓝漏洞的小知识: 黑客通过改造 永恒之蓝 制作 wannacry 制作病毒入侵高校内网。 mestaploit 攻击永恒之蓝流程: 使用模块 msfconsole配置required 模块参数运行,开始监听主机 msfconsole 主要模块 - 选择使用模块 search ms17_01…

VSCode 插件 Template String Converter

1. 插件介绍 点击安装 Template String Converter 插件 Template String Converter 翻译后:模板字符串转换器。 插件作用:当 JavaScript 字符串中键入 ${ 时自动将引号转为反引号,当删除 ${ 时自动将反引号转为普通引号 功能示例&#xff…