专栏名称: ImportNew
伯乐在线旗下账号,专注Java技术分享,包括Java基础技术、进阶技能、架构设计和Java技术领域动态等。
目录
相关文章推荐
芋道源码  ·  对领域的认知比会写代码更重要 ·  3 天前  
芋道源码  ·  魔改xxl-job,彻底告别手动配置任务! ·  3 天前  
芋道源码  ·  一款颜值超高,功能还特别强大的SSH工具 ·  6 天前  
Java编程精选  ·  SpringBoot中使用注解来实现 ... ·  1 周前  
51好读  ›  专栏  ›  ImportNew

小谈 java 内部类对象的生成过程

ImportNew  · 公众号  · Java  · 2016-12-12 21:34

正文

(点击上方公众号,可快速关注)


来源:伯乐在线专栏作者- 占小狼

点击 → 了解如何加入专栏作者

如需转载,发送「转载」二字查看说明


内部类指在一个外部类的内部再定义一个类,有点废话…,分为静态内部类和成员内部类,平常使用较多的为静态内部类,使用方式和普通类一样,本文准备在字节码层面看看成员内部类对象的生成过程。


public class Outer {  

  public class Inner { }  

  public static void main(String[] args) {  

    Outer outer = new Outer();  

    Outer.Inner inner = outer.new Inner();  

  }  

}


采用javap -c Outer命令查看字节码指令



1、第18行的invokespecial指令,调用Inner类的构造方法,并传入outer实例作为参数,所以在inner实例中可以访问外部类实例;


2、在14行中调用了outer.getClass()方法,得到的结果又在17行的pop指令抛弃了,是不是很奇怪?


先看看Java语言规范


15.9.4 Run-time Evaluation of Class Instance Creation Expressions

At run time, evaluation of a class instance creation expression is as follows. First, if the class instance creation expression is a qualified class instance creation expression, the qualifying primary expression is evaluated. If the qualifying expression evaluates to null, a NullPointerException is raised, and the class instance creation expression completes abruptly. If the qualifying expression completes abruptly, the class instance creation expression completes abruptly for the same reason.


该小节规定了在进行实例化操作时,必须对表达式进行空指针验证,如果表达式为null,则抛出NullPointerException,对应上述例子中,必须对outer对象进行验证。


规范中只是明确了“要抛出NullPointerException”的行为,至于如何实现null检查的则没规定,可以自由实现,比如用普通的if…else做验证,只不过生成的字节码就比调用getClass()的办法更长一些,getClass()方法在Object上声明的,所有对象上必然存在,由final修饰,保证了有确定的行为,而且运行开销比较低。


参考


javac在编译创建内部类对象时生成的奇怪的getClass()调用是什么?

(http://rednaxelafx.iteye.com/blog/1089554)


觉得本文对你有帮助?请分享给更多人

关注「ImportNew」,提升Java技能


专栏作者简介 ( 点击 → 加入专栏作者 )


占小狼:我是占小狼。在魔都艰苦奋斗,白天是上班族,晚上是知识服务工作者。如果读完觉得有收获的话,记得关注和点赞哦。非要打赏的话,我也是不会拒绝的。


打赏支持作者写出更多好文章,谢谢!