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

原标题:小谈 java 内部类对象的生成过程

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

497505f33bd5fedd2178de9cb93a633c.png采用 javap -c Outer命令查看字节码指令

1659968b2e0199978bd252296685ba71.png

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

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

先看看Java语言规范

15.9.4 Run-time Evaluation of Class Instance Creation ExpressionsAt 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修饰,保证了有确定的行为,而且运行开销比较低。返回搜狐,查看更多

责任编辑:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值