Java 内部类

目录

一、什么是内部类及为何要有内部类

二、四种内部类

 1.成员内部类 

 成员内部类定义:

获取成员内部类对象的方法:

成员内部类获取外部类变量:

 额外:

2.局部内部类

局部内部类定义:

如何实现内部类当中的方法:

3.静态内部类 

静态内部类定义

 获取静态内部类对象的方法:

静态内部类获取外部变量:

调用静态内部类方法:

4.匿名内部类


一、什么是内部类及为何要有内部类

内部类是指在一个类的内部定义的另一个类。它可以访问外部类的成员,并且可以被外部类的成员访问。

内部类有以下好处:

  1. 封装性:内部类可以访问外部类的私有成员,这样可以增强了封装性,外部类的私有成员不需要暴露给外部类以外的类,可以被内部类私有化访问。

  2. 实现多继承:内部类在Java中类似于C++中的多重继承。一个类可以有多个内部类,每个内部类可以继承自不同的类或实现不同的接口,从而实现多继承的效果。

  3. 隐藏实现细节:内部类可以对实现细节进行隐藏,外部类无法直接访问内部类的方法和属性,只能通过外部类对象来访问。

  4. 回调机制:通过内部类可以实现回调机制,内部类可以访问外部类的方法和成员,可以在内部类中引用外部类对象的方法,实现回调功能。

  5. 方便访问外部类的成员:外部类可以访问内部类的私有成员,这使得外部类可以很方便地访问内部类的属性和方法,而不需要通过公共的接口或方法。

  6. 高级别的封装和模块化:内部类可以将一些逻辑相关的代码集中在一起,使得外部类更加简洁和模块化。内部类可以隐藏在外部类中,只在需要的时候才暴露给外部程序。 

二、四种内部类

 1.成员内部类 

 成员内部类定义:


成员内部类是定义在一个类的内部,并直接于类的成员位置,相当于该内部类与外部类当中的成员变量和成员方法处于同等地位。它可以访问外部类的所有成员,包括私有成员。成员内部类的定义格式为:外部类.内部类 内部类对象 = 外部类对象.new 内部类()。

public class OuterClass {private int num;public class InnerClass {public void display() {System.out.println("num:" + num);}}
}

获取成员内部类对象的方法:

OuterClass outerObj = new OuterClass();  // 创建外部类对象
OuterClass.InnerClass innerObj = outerObj.new InnerClass();  // 创建成员内部类对象//或者OuterClass.InnerClass oi = new outerObj().new InnerClass();

请注意:如果成员内部类被私有(private)或受保护(protected)修饰,外部类是无法直接访问和创建成员内部类的对象的。

但仍然有几种方式可以获取成员内部类的对象: 

在外部类中提供一个公共的方法来获取成员内部类的对象。在该公共方法中,可以通过创建内部类对象并返回它来实现获取成员内部类的对象。

public class OuterClass {private class InnerClass {// ...}private InnerClass createInnerInstance() {return new InnerClass();}public void outerMethod() {InnerClass innerObj = createInnerInstance();// 使用 innerObj 进行操作}
}

成员内部类获取外部类变量:

成员内部类可以直接调用外部类的变量,但是如果成员内部类当中存在与外部类重名的变量可以参考如下代码:

public class OuterClass {private int outerVariable = 10;public class InnerClass {private int outerVariable = 20;public void printOuterVariable() {System.out.println("Inner variable: " + outerVariable);System.out.println("Outer variable: " + OuterClass.this.outerVariable);}}
}

 额外:

在JDK 16以前 是不能在成员内部类里面定影一个静态的变量的

2.局部内部类

局部内部类定义:

局部内部类地位处于外部类的局部位置,与外部类的局部变量处于同等地位。局部内部类是定义在一个方法或作用域内部的类。它只能在所在的方法或作用域内被访问,无法从外部进行访问。局部内部类的定义格式为:在方法或作用域内定义的类。 

public class OuterClass {public void display() {class LocalInnerClass {public void print() {System.out.println("局部内部类");}}LocalInnerClass innerObj = new LocalInnerClass();innerObj.print();}
}

 局部内部类的对象只能在所在方法或作用域内创建和使用,无法在外部进行访问。

局部内部类的作用范围在定义它的代码块内部,对外部类的其他方法和代码块都是不可见的

该类可直接访问外部类的成员和方法内的局部变量 

如何实现内部类当中的方法:

在测试类当中 获取外部类的对象,用该对象来调用包含局部内部类的成员方法 

3.静态内部类 

静态内部类定义

静态内部类是定义在一个类的内部,且被static修饰的类。静态内部类属于成员内部类的一种,静态内部类独立于外部类的对象存在,可以直接通过外部类访问,即外部类.静态内部类。

public class OuterClass {private static int num;public static class StaticInnerClass {public void display() {System.out.println("静态内部类,num:" + num);}}}

 获取静态内部类对象的方法:

OuterClass.StaticInnerClass innerObj = new OuterClass.StaticInnerClass();  // 创建静态内部类对象

静态内部类获取外部变量:

静态内部类可以访问外部类的静态成员和非静态成员。如果需要访问外部类的非静态成员,需要通过创建外部类的对象来访问:

OuterClass outerObj = new OuterClass();
outerObj.nonStaticMethod(); // 访问外部类的非静态方法

调用静态内部类方法:

1.非静态方法:需先创建内部类的对象

2.静态方法 :直接Outer.Inner.method();即可

4.匿名内部类

匿名内部类是一种没有命名的内部类,它通常用于创建接口、抽象类的非静态对象。匿名内部类没有构造方法,通过实例初始化块来实现特定的初始化操作。

格式:

interface MyInterface { //接口public abstract void display();//抽象方法
}new MyInterface (){
@Overridepublic void display(){
//重写该方法}
};

匿名内部类会直接实现接口或继承抽象类,并重写方法。创建匿名内部类的同时创建了该类的对象。旨在完成一些简单或者一次性操作的时候不需要创建一些类

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java复习-20-接口(3)- 代理设计模式

代理设计模式(Proxy) 功能:可以帮助用户将所有的开发注意力只集中在核心业务功能的处理上。 代理模式(Proxy Pattern)是一种结构性模式。代理模式为一个对象提供了一个替身,以控制对这个对象的访问。即通过代理对象访问目标目标对象,可以在目…

自动化测试系列 —— UI自动化测试

UI 测试是一种测试类型,也称为用户界面测试,通过该测试,我们检查应用程序的界面是否工作正常或是否存在任何妨碍用户行为且不符合书面规格的 BUG。了解用户将如何在用户和网站之间进行交互以执行 UI 测试至关重要,通过执行 UI 测试…

AR产业变革中的“关键先生”和“关键力量”

今年6月的WWDC大会上,苹果发布了头显产品Vision Pro,苹果CEO库克形容它: 开启了空间计算时代。 AR产业曾红极一时,但因为一些技术硬伤又减弱了声量,整个产业在起伏中前行。必须承认,这次苹果发布Vision P…

zabbix监控网络设备和zabbix proxy

监控linux主机 [rootrocky8 conf]# yum -y install net-snmp vim /etc/snmp/snmpd.conf com2sec notConfigUser default 123456##修改此行,设置团体密码,默认为public,此处 改为123456 view systemview included .1. ##添加此行,自定义授权,否则 zabbix 无法获取数据 [rootr…

什么合同管理系统?4类合同管理软件评测

说到合同管理系统,前提还是弄清楚合同有哪些类型,合同管理有那些痛点,才好对症下药。 一、合同的类型和合同管理的痛点 从法律角度来说,合同可以分为:有名合同与无名合同、单务合同与双务合同、有偿合同与无偿合同、…

conda环境安装opencv带cuda版本

主要是cmake编译选项需要修改 以下两个选项按照自己情况修改 -D OPENCV_EXTRA_MODULES_PATH../opencv_contrib/modules \ -D CUDA_TOOLKIT_ROOT_DIR/usr/local/cuda-12.2 \ 其中/home/lixin/anaconda3/envs/stereo 改成你自己的conda环境 cmake -D CMAKE_BUILD_TYPER…

MySQL阻塞与死锁

MySQL阻塞与死锁 阻塞 因为不同锁之间的兼容性关系,在有些时刻一个事务中的锁需要等待另一个事务中的锁释放它所占用的资源,这就是阻塞。 # 查看等待时间 show variables like innodb_lock_wait_timeout; SETinnodb_lock_wait_timeout60; # 是否在等待…

Java版企业电子招标采购系统源码Spring Cloud + Spring Boot +二次开发+ MybatisPlus + Redis

功能描述 1、门户管理:所有用户可在门户页面查看所有的公告信息及相关的通知信息。主要板块包含:招标公告、非招标公告、系统通知、政策法规。 2、立项管理:企业用户可对需要采购的项目进行立项申请,并提交审批,查看…

两个类文件,实现根据返回的id显示对应的人员信息增强返回

后台与前台交互时,由于后台存放的原始信息可能就是一些id或code,要经过相应的转换才能很好地在前台展示。 比如: select id, user_id from user 直接返回给前台时,前台可能要根据你这个user_id作为参数,再请求一次后…

【方法】如何取消7Z压缩文件加密的密码?

给7Z格式的压缩文件设置了密码,后续又不需要了,如何取消呢?如果忘记密码,还能取消吗?下面小编来分享一下方法。 首先,我们需要使用支持7Z格式的解压缩软件,如果使用的是WinRAR或者7-Zip解压缩软…

Docker从认识到实践再到底层原理(二-2)|Namespace+cgroups

前言 那么这里博主先安利一些干货满满的专栏了! 首先是博主的高质量博客的汇总,这个专栏里面的博客,都是博主最最用心写的一部分,干货满满,希望对大家有帮助。 高质量博客汇总 然后就是博主最近最花时间的一个专栏…

OceanBase社区版4.x核心技术解密

数字化时代,各行各业的数据量呈现爆发式增长,对于海量数据价值的挖掘和应用,正成为推动创新的主要力量,与此同时,数据计算复杂度正在提升。在此背景下,对于数据处理的基石数据库而言,正面临市场…

数学建模--非多项式拟合法的Python实现

目录 1.算法异同区别 2.算法核心步骤 3.算法核心代码 4.算法效果展示 1.算法异同区别 #*************************************************************************************************************# 方法区别探究 1.对于多项式拟合你需要大致知道这些点的分布&#xf…

jsvmp逆向(补环境篇)

书接上回 上篇文章写到tx的jsxmp的算法逆向,文章链接在这里。初试jsvmp加密 。但是可能有伙伴觉得不够详细。 这里放一个大佬的文章链接。 https://www.52pojie.cn/thread-1521480-1-1.html 。其实就是一个变形的xtea加密。 大佬的文章已经讲了很清楚了&#…

Spring MVC入门必读:注解、参数传递、返回值和页面跳转

一、常用注解 1.1.RequestMapping 作用:用于映射请求路径与处理请求的方法之间的关系,可以用在类或方法上 。 标注在方法上 用于方法上,表示在类的父路径下追加方法上注解中的地址将会访问到该方法 Controller public class HelloContro…

Redis集群服务器

集群简介 试想有一家餐厅,如果顾客人数较少,那么餐厅只需要一个服务员即可,如图1。但是,当顾客人数非常多时,一个服务员是绝对不够的,如图2。此时,餐厅需要雇用更多的服务员来解决大量访问&…

Acwing算法心得——现代艺术(统计遍历)

大家好,我是晴天学长,先用两个一维数组维护数据,再统计遍历二维数组,需要的小伙伴请自取哦!💪💪💪 1 )现代艺术 2) .算法思路 现代艺术 1.两个数组维护行和列 2.遍历数组…

git在windows上安装

介绍git工具在windows上如何安装 git官网下载地址 1.1、下载 https://github.com/git-for-windows/git/releases/download/v2.36.0.windows.1/Git-2.36.0-64-bit.exe自行选择版本,这里我选择的是 Git-2.36.0-64-bit这个版本 1.2、安装 安装路径选择英文且不带空格…

Vue组件之间传值

聊一聊vue里面组件之间的传值 首先总结一下vue里面传值的几种关系: 如上图所示, A与B、A与C、B与D、C与F组件之间是父子关系; B与C之间是兄弟关系;A与D、A与E之间是隔代关系; D与F是堂兄关系,针对以上关系 我们把组件…

Java中级面试题记录(三)

1.职业规划? 2.每家公司离职原因? 3.SpringCloud用到了哪些组件? GateWayNacosOpenFeignSeataHystrix 4.PG和Mysql的区别? 5.两种数据库的存储区别? 6.MySQL索引了解的内容? 一口气搞定索引的所有知识…