包含内部类的.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,一经查实,立即删除!

相关文章

java服务端无法发送给客户端,无法从客户端向服务器发送消息

我正在开发一个应用程序,我需要从客户端向服务器发送消息,并在客户端上的文件发生更改时通知服务器 . 我在Qt中使用QTcpServer和QTcpSocket类 . 我正在写socket并从服务器端的socket读取但是我的读取失败了 .我可以知道如何将消息发布到服务器 . 我需要在…

java 泛型详解

对java的泛型特性的了解仅限于表面的浅浅一层,直到在学习设计模式时发现有不了解的用法,才想起详细的记录一下。 本文参考java 泛型详解、Java中的泛型方法、 java泛型详解 1. 概述 泛型在java中有很重要的地位,在面向对象编程及各种设计模式…

mysql 截取字符串部分值,Mysql字符串截取_获取指定字符串中的数据

搜索热词前言:本人遇到一个需求,需要在MysqL的字段中截取一段字符串中的特定字符,类似于正则表达式的截取,苦于没有合适的方法,百度之后终于找到一个合适的方法:substring_index(www.sqlstudy.com.cn,.,-2)…

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

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

php嗅探木马,PHP安全-密码嗅探

密码嗅探尽管攻击者通过嗅探(察看)你的用户和应用间的网络通信并不专门用于访问控制,但要意识到数据暴露变得越来越重要,特别是对于验证信息。使用SSL可以有效地防止HTTP请求和回应不被暴露。对任何使用https方案的资源的请求可以防止密码嗅探。最好的方…

Idea进行远程Debug

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

如何用php查不同,php-MySql调查不同查询

大家好,我确实在MySql查询中苦苦挣扎,我有一个名为“ info”的表,并且其中有一个名为“ rating”的列,评分在1-10之间.现在,我需要生成一个百分比值,该百分比值表示1-6、7-8和9-10中有多少评级,但我需要它们拼命显示,之后我需要第二个查询,该查询可以从中减去结果的百分比值1-6…

如何使用websocket实现前后端通信

如何使用websocket实现前后端通信 websocket通信是很好玩的&#xff0c;也很有用的的通信方式&#xff0c;使用方式如下&#xff1a; 第一步由于springboot很好地集成了websocket&#xff0c;所以先在在pom.xml文件中引入依赖 <dependency><groupId>org.springfr…

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

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

tail查看nohup.out文件内容

1.前台实时查看nohub.out文件内容&#xff1a; tail -f nohup.out 2.根据关键字查看 tail -f nohup.out |grep "关键字"3.输出文件最后100行 tail -n 100 nohup.out 4.输出文件最后100行&#xff0c;含关键字 tail -n 100 nohup.out |grep "关键字"

Linux nohup实现后台运行程序及查看(nohup与)

Linux nohup实现后台运行程序及查看&#xff08;nohup与&&#xff09; 更新时间&#xff1a;2019年09月11日 09:28:40 作者&#xff1a;猿的生活 这篇文章主要介绍了Linux nohup实现后台运行程序及查看&#xff08;nohup与&&#xff09;&#xff0c;文中通过示例代码…

php面向对象异常处理,PHP面向对象编程——自定义PHP异常处理类

/*?* WEB开发笔记 www.chhua.com 每日练习 PHP面向对象编程——自定义PHP异常处理类?* 这所以用自定义的异常类&#xff0c;主要是区分异常来自程序的哪一部分&#xff0c;比如是来自MYSQL的还是来自MODEL的?* 一般情况下&#xff0c;自定义的异常类也不要太多&#xff0c;否…

java createstatement,createStatement参数说明

Statement stmtconn.createStatement(参数一,参数二)第一个参数可以取值为ResultSet.RTYPE_FORWORD_ONLY:这是缺省值,只可向前滚动;ResultSet.TYPE_SCROLL_INSENSITIVE:双向滚动,但不及时更新,就是如果数据库里的数据修改过,并不在ResultSet中反应出来.ResultSet.TYPE_SCROLL_S…

websocket的用途/场景

websocket的用途/场景 先总结&#xff1a;高即时性服务&#xff0c;比如聊天室的群聊&#xff0c;server顺序收到了张三&#xff0c;李四的消息&#xff0c;立即就推送给王五&#xff0c;不能让王五等半天。 Ajax也可以一秒一刷&#xff0c;让王五去问张三说话没&#xff0c;如…

websocket学习总结记录

Websocket 1.基本概念 WebSocket是一种网络通信协议。 websocket和http 的区别&#xff0c;http的缺陷&#xff0c;只能从客户端发起请求&#xff08;单项请求&#xff09;不能从服务器发起请求。如果服务器有连续性的变化时&#xff0c;如果我们想要每一个时刻都获得最新的…

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

PHP关联数组按键名完成降序分列&#xff0c;我们能够直接经由过程PHP中的krsor()函数来完成。krsort函数示意对数组根据键名逆向排序。那末在前面的文章中&#xff0c;已给人人引见过PHP关联数组按键名完成升序分列的要领。下面我们继承连系简朴的示例&#xff0c;给人人引见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提 供 者: 无语详细说明&#xff1a;神经信号spike 分类及处理 工具包-A toolbox for neurophysiological data processing文件列表(点击判断是否您需要的…

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

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

Idea怎么实现画类图

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

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

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