详解Java的内部类

一、基本介绍

        一个类的内部又完整的嵌套了另一个类结构。被嵌套的类称为内部类(inner class)嵌套其他类的类称为外部类(outer class)。它是我们类的第五大成员,内部类最大的特点就是可以直接访问私有属性,并且可以体现类与类之间的包含关系。

二、内部类的分类 

2.1 定义在外部类局部位置上(比如方法内):

①局部内部类(有类名)

②匿名内部类(没有类名,重点)

2.2 定义在外部类的成员位置上:

①成员内部类(没用static修饰)

②静态内部类(使用static修饰)

三、内部类的使用细节

3.1 局部内部类

1.局部内部类是定义在外部类的局部位置,比如方法中或者代码块中,并且有类名。

class OuterClass {private int n1 = 10;public void m1() {class InnerClass {//内部类}}
}

2.可以直接访问外部类的所有成员,包含外部类私有的成员

class OuterClass {private int n1 = 10;public void m1() {class InnerClass {//内部类public void f1(){System.out.println("n1="+n1);}}}
}

3.不能添加访问修饰符,因为它的地位就是一个局部变量。局部变量是不能使用修饰符的。但是可以使用final 修饰(这样就不可被继承),因为局部变量也可以使用final

class OuterClass {private int n1 = 10;public void m1() {class InnerClass {//内部类public void f1(){System.out.println("n1="+n1);}}class InnerClass1 extends InnerClass{//继承上面的内部类}}
}

4.作用域:仅仅在定义它的方法或代码块中

5.局部内部类可以访问外部类的成员

6.外部类访问局部内部类的成员,访问方式:  创建对象,再访问(注意:必须在作用域[所定义内部类的方法中]内)

7.如果外部类和局部内部类的成员重名,那么调用遵循就近原则(即先找局部内部类的成员),如果想访问外部类的成员变量,则需使用 

外部类名.this.成员

           //很好理解,我们可以解读为,外部类的对象的成员

 3.2 匿名内部类

匿名内部类是定义在外部类的局部位置,比如方法中或者代码块中,并且没有类名;

匿名内部类的使用是为了简化开发

①基于接口的匿名内部类

假如:我们有一个需求,“使用IA接口,并创建对象使用其方法”

按照传统方法:我们需要①编写实现类实现接口的方法②new实现类的实例

public class AnonymousInnerClass {public static void main(String[] args) {Animal animal = new Animal();animal.eat();}
}interface IA {void eat();
}class Animal implements IA {@Overridepublic void eat() {System.out.println("动物吃饭");}
}

现在,有了匿名内部类,我们就可以这样实现:

public class AnonymousInnerClass {public static void main(String[] args) {IA animal = new IA() {@Overridepublic void eat() {System.out.println("动物吃饭");}};animal.eat();}
}interface IA {void eat();
}

说是匿名,其实是有名字的,在底层,系统给它起了名字,底层实现类似(大概模拟)这样:

class XXXX implements IA {@Overridepublic void eat() {System.out.println("动物吃饭");}
}

类名是由系统起的,我们可以通过.getClass( )方法获取其运行时类型,编译类型当然是IA这不用说。

注意:匿名内部类只能使用一次,也就是只能new一个实例对象,这不代表其引用就能用一次。匿名内部类需要把接口的抽象方法都实现。

②基于普通类的匿名内部类
public class AnonymousInnerClass {public static void main(String[] args) {Animal animal = new Animal("老虎") {@Overridevoid eat() {System.out.println(this.name+"要吃肉");}};System.out.println(animal.getClass());animal.eat();}
}class Animal {String name;void eat() {System.out.println(this.name + "要吃饭");}public Animal(String name) {this.name = name;}
}

底层实现(大概模拟)

class XXXX extends Animal{

@Override
void eat() {System.out.println(this.name+"要吃肉");}
}

我们可以通过.getClass( )方法获取其运行时类型

③基于抽象类的匿名内部类
public class AnonymousInnerClass {public static void main(String[] args) {Animal animal = new Animal("老虎") {@Overridevoid eat() {System.out.println(this.name + "吃肉");}};System.out.println(animal.getClass());animal.eat();}
}abstract class Animal {String name;abstract void eat();void shout() {System.out.println("动物大叫");}public Animal(String name) {this.name = name;}
}

必须把抽象类中的抽象方法都实现。

这里补充说明一下,父类的私有属性可以被子类继承,但是子类无法使用;父类的构造方法,子类无法继承,但是子类创建对象会先调用父类的构造方法(默认是无参构造方法),以上案例匿名内部类应该是调用了父类的有参构造方法。

3.3 成员内部类

成员内部类定义在外部类的成员位置,并且没有static修饰。

可以添加任意访问修饰符(public、protected、默认、private),因为它的地位是一个成员。

1.成员内部类可访问外部类所有成员,包括私有的

 使用内部类方法一

public class ChengYuan {public static void main(String[] args) {OuterClass outerClass = new OuterClass();outerClass.shiYong();}
}class OuterClass {int n = 10;public void eat() {System.out.println("吃顿饭");}class innerClass {public void f1() {System.out.println(n);eat();}}public void shiYong() {innerClass innerClass = new innerClass();innerClass.f1();}
}

使用内部类方法二

        OuterClass.innerClass innerClass = outerClass.new innerClass();innerClass.f1();

使用内部类方法三

外部类写方法,返回内部类对象

    public InnerClass shiYong1(){return new InnerClass();}

3.4 静态内部类

静态内部类是定义在外部类的成员位置,并且有static修饰

可以直接访问外部类的所有静态成员,包含私有的,但不能直接访问非静态成员

可以添加任意访问修饰符(public、protected、默认、private),因为它的地位就是一个成员。

作用域:同其他的成员,为整个类体

静态内部类可通过类名直接访问

public class ChengYuan {public static void main(String[] args) {OuterClass.InnerClass innerClass = new OuterClass.InnerClass();innerClass.f1();}
}class OuterClass {static int n = 10;static class InnerClass {public void f1() {System.out.println(n);}}
}

如果外部类和静态内部类的成员重名时,静态内部类访问的时,默认遵循就近原则,如果想访问外部类的成员,则可以使用(外部类名.成员)去访问。

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

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

相关文章

Maven的基本使用

引入依赖 1.引入Maven仓库存在的依赖&#xff0c;直接引入&#xff0c;刷新Maven <dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.2.12.RELEASE</version> </dependency…

Redis代替Session实现共享

集群的session共享问题 session共享问题&#xff1a;多台tomcat并不共享session存储空间&#xff0c;当请求切换到不同的tomcat服务时导致数据丢失的问题。 session的替代方案&#xff1a; 数据共享内存存储key、value结构 将redis替换session可以解决session共享问题

从天空到地面:无人机航拍推流直播技术在洞庭湖决口封堵中的全方位支援

据新闻报道&#xff0c;受持续强降雨影响&#xff0c;湖南省华容县团洲垸洞庭湖一线堤防发生管涌险情&#xff0c;随后出现决口。截至7月8日20时左右&#xff0c;226米长的洞庭湖一线堤防决口已累计进占208米&#xff0c;目前剩余18米&#xff0c;有望在今晚或9日凌晨实现合龙。…

7.9实验室总结 SceneBuilder的使用方法+使用javafx等

由于下错了东西&#xff0c;所以一直运行不出来&#xff0c;今天一直在配置环境&#xff0c;配置好了才学&#xff0c;所以没学多少&#xff0c;看了网课学习了SceneBuilder的使用方法还有了解了javafx是怎么写项目的&#xff0c;&#xff0c; 学习了怎么跳转页面&#xff1a;…

溶解氧(DO)理论指南(2)

转载自梅特勒官网资料&#xff0c;仅用于学习交流&#xff0c;侵权则删&#xff01; 溶解氧理论指南 2 DO电极类型2.1 氧化还原化学简介2.2 原电池法溶解氧电极2.3 极谱法溶解氧电极2.3 光学法溶解氧电极 2 DO电极类型 O2是一种高活性分子&#xff0c;因为它是通过光合作用连…

Ensp配置防火墙的web界面

Ensp配置防火墙的web界面 准备工作新建网卡配置网卡 启动防火墙配置防火墙注意事项和错误如果云里面没有网卡选项防火墙启动不了没有web界面启动不了没有web界面 准备工作 新建网卡 我用的是win10系统&#xff0c;新建网卡 先右键管理 再点击设备管理器 --- 再网络适配器 接…

PostgreSQL 中如何处理数据的并发更新冲突解决?

文章目录 一、并发更新冲突的场景二、PostgreSQL 中的并发控制机制&#xff08;一&#xff09; 封锁机制&#xff08;二&#xff09; 事务隔离级别 三、并发更新冲突的解决方法&#xff08;一&#xff09; 重试机制&#xff08;二&#xff09; 使用乐观并发控制&#xff08;三&…

【目标跟踪】CoTracker 环境配置

配置 CoTracker 环境 首先下载 conda&#xff0c;然后安装虚拟环境。 1.创建环境&#xff1a;如果环境不存在&#xff0c;你需要创建一个新的 conda 环境。可以使用以下命令创建名为 cotracker 的环境&#xff1a; conda create -n cotracker python3.x 其中 3.x 是你想要安…

【区块链+跨境服务】湾区金融科技人才链 | FISCO BCOS应用案例

湾区金融科技人才链于 2020 年 8 月正式发布&#xff0c;是全国首创的金融科技人才创新举措&#xff0c;对推动金融科技人才机制和认证标准建立&#xff0c;促进金融科技人才要素自由流通&#xff0c;推进产业 链、技术链、人才链深度融合具有重大意义。以深港澳金 融科技师专才…

鸟类领域超大规模检测实践,基于YOLOv8轻量级检测模型开发构建超大规模生活场景下500种鸟类检测识别分析系统

关于鸟类的检测、识别相关的开发实践在前面的系列博文中也有不少的实践记录&#xff0c;感兴趣的话可以自行移步阅读即可&#xff1a; 【检测类】 《AI识鸟&#xff0c;基于YOLOv5【n/s/m/l/x】全系列参数模型开发构建工业野外场景下鸟类检测识别分析系统》 《基于轻量级YOL…

STM32G474使用HRTIM触发多路ADC采样,通过DMA传输,通过串口打印显示,实现PWM中间时刻采样,避免开关噪声

本工程使用CUBEIDE进行配置以及编译调试&#xff0c;使用的硬件为STM32G474官方开发板NUCLEO-G474RE CUBEIDE配置 HRTIM配置 本章工程使用HRTIM定时器进行ADC的触发&#xff0c;打开主定时器&#xff0c;子定时器A,B,C。&#xff08;本工程未使用到A与C定时器&#xff0c;配置…

高性能Python网络框架实现网络应用详解

概要 Python作为一种广泛使用的编程语言,其简洁易读的语法和强大的生态系统,使得它在Web开发领域占据重要位置。高性能的网络框架是构建高效网络应用的关键因素之一。本文将介绍几个高性能的Python网络框架,详细描述它们的特点、使用场景及具体示例代码,帮助高效实现网络应…

leetcode--验证二叉搜索树

leetcode地址&#xff1a;验证二叉搜索树 给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&#xff1a; 节点的左 子树 只包含 小于 当前节点的数。 节点的右子树只包含 大于 当前节点的数。 所有左子树和右子树自身必…

StarRocks分布式元数据源码解析

1. 支持元数据表 https://github.com/StarRocks/starrocks/pull/44276/files 核心类&#xff1a;LogicalIcebergMetadataTable&#xff0c;Iceberg元数据表&#xff0c;将元数据的各个字段做成表的列&#xff0c;后期可以通过sql操作从元数据获取字段&#xff0c;这个表的组成…

数据结构——顺序表【C】

顺序表 1. 顺序表的概念以及结构1.1概念1.2静态顺序表和动态顺序表 2. 顺序表接口模拟实现接口总览2.1 初始化数据和销毁容器 2.2 顺序表的尾插和尾删2.3 头插和头删2.4 任意位置插入和删除数据2.5 查找数据 3. 顺序表的问题 &#xff1a; 1. 顺序表的概念以及结构 1.1概念 顺…

贴脸细看Mixtral 8x7B- 稀疏混合专家模型(MoE)的创新与推动

贴脸细看Mixtral 8x7B- 稀疏混合专家模型&#xff08;MoE&#xff09;的创新与推动 原创 一路到底孟子敬 上堵吟 2024年01月15日 20:05 美国 I. 引言 A. Mixtral 8x7B的背景和目的 • 背景&#xff1a;随着大型语言模型在自然语言处理&#xff08;NLP&#xff09;领域的广泛…

社交论坛圈子系统APP开发社交圈子小程序系统源码开源,带语音派对聊天室/圈子社交论坛及时聊天

功能// 首页左右滑动切换分类 使用资讯类app常见的滑动切换分类&#xff0c;让用户使用更方便。 2信息卡片流展示 每条信息都是一个卡片&#xff0c;头像展示会员标签&#xff0c;单图自动宽度&#xff0c;多图九宫格展示&#xff0c;底部展示信息发布地址&#xff0c;阅读量、…

Camera Raw:常规工具

在 Camera Raw 窗口右下角提供了四个常用的工具&#xff0c;它们分别是&#xff1a;缩放工具、抓手工具、切换取样器叠加以及切换网格叠加工具。 ◆ ◆ ◆ 缩放工具 Zoom Tool 用于放大或缩小预览图像&#xff0c;便于查看和编辑细节。 快捷键&#xff1a;Z 1、双击“缩放工具…

10-windows自带的磁盘上传配额限制?提示这个错误:XXX用户上空间不足,需要XXMB来复制此项目,请删除或移动文件来获得足够的空间如何解决?

1.配置缘由&#xff1a; Windows自带的功能&#xff1a;限制某个磁盘登录的用户上传到这块磁盘的文件容量大小。 2.配置磁盘配额步骤: 右键整块磁盘--属性--配额 3.提示这个错误&#xff1a;XXX用户上空间不足&#xff0c;需要XXMB来复制此项目&#xff0c;请删除或移动文件来…

普中51单片机:中断系统与寄存器解析(六)

文章目录 引言中断流程图中断优先级下降沿中断结构图中断相关寄存器IE中断允许寄存器&#xff08;可位寻址&#xff09;XICON辅助中断控制寄存器&#xff08;可位寻址&#xff09;TCON标志控制寄存器SCON串行口控制寄存器 中断号中断响应条件中断函数代码模板电路图开发板IO连接…