包含内部类的.java文件编译后生成几个.class文件

如果一个类有内部类,编译将生成几个字节码文件,规则是怎样呢?

写在前,自己动手丰衣足食,结论只有个人实验支持,没有官方数据支持,欢迎自行查阅文档然后来指正,轻喷,谢谢。

1.普通类包含内部类的样例

public class Test319 {private static class StaticInner{ }//静态内部类private class Inner{}//成员内部类public void outerFunction1(){class PartInner3{}//局部内部类3}public void outerFunction2(){class PartInner1{}//局部内部类1class PartInner2{}//局部内部类2}public Thread thread1 = new Thread(new Runnable() {//匿名内部类1@Overridepublic void run() {}}, "thread1");public Thread thread2 = new Thread(new Runnable() {//匿名内部类2@Overridepublic void run() {}}, "thread2");public Thread thread3 = new Thread(()->{//匿名内部类(使用lambda表达式)},"thread3");
}

2.编译后生成的文件目录

编译后生成的clas文件目录

3.小总结

首先,包括外部类在内一共有9个类,而目录中只有8个class文件,可以看出一套规律:全部内部类编译后都会生成字节码文件,但是匿名内部类有个特点
1.成员内部类:外部类名后加一个dollar接内部类名
2.静态内部类:和成员内部类一样(毕竟都是外部类的成员,静态非静态而已)
3.局部内部类:在dollar后比成员内部类多了个数字
4.匿名内部类:dollar后只有一个数字,如果使用lambda表达式创建匿名内部类将不生成class文件,否则会生成
其次,局部内部类和不使用lambda表达式创建的匿名内部类,他们的class文件名都包含数字,数字究竟是什么含义?(在没有查资料的情况下,首先猜测,数字顺序就是内部类声明的顺序)先用两个匿名内部类来进行测试,后面再说局部内部类的问题。

4.关于文件名中数字的测试(匿名内部类)

第一步,为了观察方便给代码做些调整,加入简单的方法体。

public Thread thread1 = new Thread(new Runnable() {//匿名内部类1@Overridepublic void run() {System.out.println("Hello World");}}, "thread1");public Thread thread2 = new Thread(new Runnable() {//匿名内部类2@Overridepublic void run() {int i = 10;i += 1;}}, "thread2");

先声明的进行print操作,后声明的进行int加法计算。通过javap命令对两个字节码进行解释,结果如下:
class文件名中数字为1
class文件名中数字为2
由上述过程可看出,小数字的进行了print,大数字的进行了int+1,而定义的顺序也就是print操作的在前,int+1操作的在后。
第二步,使用相同手法,在.java文件中调换两个操作的声明顺序,即先声明的进行int+1操作,后声明的进行print操作,得到了相同的结论,具体不再赘述。
通过反复实验,结果一致。但因为没有查阅官方文档,先提出一个我自己的想法:数字顺序是内部类的声明顺序,同时作为区分匿名内部类的依据

5.关于局部内部类

再回过头说局部内部类的问题。匿名内部类没有名字自然需要数字区分,那么如果其他有名字的内部类名称重复怎么办(此情况只能发生于局部内部类)?同样可以先得出一个结论,数字是区分重名局部内部类的依据
但是我发现数字顺序并不是声明顺序……不再赘述实验过程,简单来说在外部类的两个方法里定义名称相同的局部内部类,调换两个方法的声明位置。编译后文件目录如下:
在这里插入图片描述
这里看出数字不再是声明顺序,定义了两个局部内部类的方法我是后声明的,数字反而变成了1而不是2。有种被逗了的感觉。秉持着“死也不去查资料先作作看结果”的精神,实验继续……(*其实是我不知道该去看官方的哪个文档,也懒得去找*
新定义和新编译生成的文件目录如下:

public class Test319 {public void outerFunction1(){class PartInner1{}}public void outerFunction2(){class PartInner1{}class PartInner2{}}public void outerFunction3(){class PartInner1{}class PartInner2{}class PartInner3{}}
}

在这里插入图片描述
差一点,我就以为数字顺序是内部类所在方法定义的逆序了。还好所做了几组实验,毕竟自己归纳就已经很不科学了,更不能仅从一组实验就得出结论。中间步骤不说了,直接来看最后一组实验:

public class Test319 {public void outerFunction1(){class PartInner1{}}public void outerFunction3(){class PartInner1{}class PartInner2{}class PartInner3{}}public void outerFunction2(){class PartInner1{}class PartInner2{}class PartInner3{}class PartInner4{}class PartInner5{}}public void outerFunction0(){class PartInner1{}class PartInner2{}class PartInner3{}class PartInner4{}}
}

在这里插入图片描述
具体的自行细品吧,直接说我的结论:定义内部类个数最多的方法,它里面的内部类生成的class文件,名称里的数字就是最小的。

6.最终总结

大致总结在上面的【3】,再总结一下关于数字的事情。
首先关于为什么会有数字,因为匿名内部类没名字(废话。。。),局部内部类名称可能相同,所以数字用来做不同内部类之间的区分,这也是为什么只有他们两个编译出来的字节码文件,名称中带有数字。
其次关于数字顺序,匿名内部类,数字顺序是声明顺序;局部内部类,定义内部类个数最多的方法,它里面的内部类生成的class文件,名称里的数字就是最小的。
以上是个人实验的结果,未查阅文档,有一定的不可靠性。但是懒得去找和读文档了,欢迎指正。

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

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

相关文章

Intellij IDEA远程debug教程实战和要点总结

远程调试,特别是当你在本地开发的时候,你需要调试服务器上的程序时,远程调试就显得非常有用。 JAVA支持调试功能,本身提供了一个简单的调试工具JDB,支持设置断点及线程级的调试同时,不同的JVM通过接口的协…

Idea进行远程Debug

Idea远程调试 当把一个本地项目部署到远程服务器后有可能出现意想不到错误,这个时候通过远程调试能够更清楚的找到bug所在位置。本篇主要讲解如何使用Idea开发工具 进行调试1.远程调试服务器上面的SpringBoot 项目2.远程调试服务器上运行在tomcat中的项目&#xff…

matlab表示DFT和DTFT,【 MATLAB 】离散傅里叶级数(DFS)与DFT、DTFT及 z变换之间的关系...

上篇博文我们简单的讨论了离散傅里叶级数DFS和离散傅里叶变换DFT之间的关系,简单地说,DFT就是DFS在一个周期内的表现。为了后面讨论方便,这里给出DFS的系数公式(分析公式):(1) 其中:综合公式:(2) 为了对比&…

php分列显示,【杂谈】PHP数组怎样按键名完成降序分列

PHP关联数组按键名完成降序分列,我们能够直接经由过程PHP中的krsor()函数来完成。krsort函数示意对数组根据键名逆向排序。那末在前面的文章中,已给人人引见过PHP关联数组按键名完成升序分列的要领。下面我们继承连系简朴的示例,给人人引见PH…

spike 序列matlab,SPKtool1.0.1 神经信号spike 分类及处理 工具包 matlab 238万源代码下载- www.pudn.com...

文件名称: SPKtool1.0.1下载收藏√ [5 4 3 2 1 ]开发工具: matlab文件大小: 937 KB上传时间: 2013-03-05下载次数: 3提 供 者: 无语详细说明:神经信号spike 分类及处理 工具包-A toolbox for neurophysiological data processing文件列表(点击判断是否您需要的…

cuda加速求解龙格库塔四阶五步积分

一般代码使用cuda加速的方法: 使用PyTorch进行加速: 首先,你需要将你的ODE系统定义为PyTorch模型,这样可以利用PyTorch的自动微分功能和GPU加速。然后,你需要将数据和参数转换为PyTorch张量,并将它们移动到…

Idea怎么实现画类图

1.【file】-【Settings】-【Tools】-【Diagrams】-勾选Java Class Diagram的选项 2.右击类,【Diagrams】-【Show Diagram】

如何在linux下创建一个可运行shell脚本?

linux系统下,经常会用到自启动脚本,那么如何新建一个自启动脚本? 工具/原料 linux系统 方法/步骤 1 新建一个.sh文件,touch test.sh 2 编辑test.sh文件,vi test.sh 然后键入i,输入内容, #!…

TCP 协议(包含三次握手,四次挥手)

文章目录1.确认应答机制 (ACK)2.超时重传3.1建立连接 - 三次握手 ▲3.2.断开连接 - 四次挥手 ▲1.确认应答机制 (ACK) 确认应答是可靠传输的最核心机制 接收方反馈一个应答报文(ACK),表示已收到 假设现在 A 想去 B 家里玩游戏,于是 A 给 B 发消息&…

Redis使用单线程却快到飞起的原因

文章目录Redis为什么用单线程?多线程的开销Redis使用单线程为什么还这么快?网络与IO操作的潜在阻塞点基于多路复用的高性能IO模型回调机制Redis的性能瓶颈点其他Redis相关的有趣问题1. 为什么要用Redis,直接访问内存不好吗?2. 数据…

线程池参数到底要怎么配?

文章目录1 线程池快速回顾2 现有设置参数的方法及不足3 如何设置核心线程数(corePoolSize)4 如何设置最大线程数(maxPoolSize)5 如何改变等待队列长度想必大家对Java里面线程池( 类)一定不陌生吧&#xff0…

彻底搞懂Cookie、Session、JWT和Token

文章目录引入:http是一个无状态协议?怎么解决呢?一、Cookie和Session1.1 cookie 注意事项:1.2 cookie 重要的属性1.3 session 注意事项:1.4 Cookie 和 Session 的区别:二、token(令牌&#xff0…

你真的知道什么是多线程吗?为什么要学习多线程?

文章目录1、多线程的含义2、原理3、优势4、线程与进程的区别5、线程与多线程的区别6、线程调度的分类7、同步与异步8、并发与并行9、为什么要使用线程池10、线程池的好处11、线程池的分类12、意义1、多线程的含义 多线程(multithreading),是…

oracle 表关联索引优化,Oracle执行计划调优-超级大表关联超级小表的性能调优

今日客户现场出现一个查询SQL异常慢的情况。用时分钟级别。SELECT *FROM (SELECT a1.*, rownum rnFROM (SELECT openOrder2017.exchId,............openOrder2017.internalbizmark,customer.typeIdListFROM openOrder2017, customerWHERE openOrder2017.custId customer.custI…

Common Sort - 排序 - Java

文章目录排序概念稳定性(重要)应用 - 举例1.、各大商城的价格从低到高等2、中国大学排名常见的排序算法(8 种)- 总览直接插入排序模拟实现 - 插入排序稳定性分析结论希尔排序思考原理科学家的分组思维模拟实现 - 希尔排序总结选择…

linux的运行级别如何更改成6,把Linux运行级别设置为6后如何解决的经验分享

我们知道,Linux有7个运行级别,而运行级别设置为6后,会导致Linux系统刚启动完成就立刻重启,重启后又会立刻重启,如此反复,导致系统不能正常运行。本文笔者和大家分享一下误把Linux运行级别设置为6后如何解决…

Redis五种数据结构应用场景

文章目录前言二、字符串String2.1、常用操作2.2、应用场景2.2.1、单值缓存(最常用)2.2.2、对象缓存2.2.3、分布式锁2.2.4、计数器三、哈希hash3.1、常用操作3.2、应用场景3.2.1、对象缓存3.2.2、 电商购物车四、列表list4.1、常用操作4.2、应用场景4.2.1…

IntelliJ IDEA中的神仙插件

文章目录1. Alibaba Java Coding Guidelines2.GsonFormat3.A8Translation4.Maven Helper5.Free Mybatis plugin6.Grep Console7.Lombok8.Nyan progress bar9.FindBugs-IDEA10.Key Promoter X11.JavaDoc12.ignore13.RainbowBrackets14.Activate-power-mode15.CodeGlance16.Gener…

linux 远程拒绝服务,Linux Kernel SCTP远程拒绝服务漏洞

发布日期:2011-08-30更新日期:2011-08-30受影响系统:Linux kernel 2.6.x描述:--------------------------------------------------------------------------------BUGTRAQ ID: 49373CVE ID: CVE-2011-2482Linux Kernel是Linux操…

SpringBoot使用Websocket

webSocket是HTML5的一种新协议,它实现了服务端与客户端的全双工通信,建立在传输层,tcp协议之上,即浏览器与服务端需要先建立tcp协议,再发送webSocket连接建立请求。webSocket的连接:客户端发送请求信息&…