难度
初级
学习时间
10分钟
适合人群
零基础
开发语言
Java
开发环境
- JDK v11
- IntelliJ IDEA v2018.3
提示
本教学属于系列教学,内容具有连贯性,本章使用到的内容之前教学中都有详细讲解。
1.外部类持有内部类对象
通常,我们外部类持有内部类对象,只需将new一个内部类对象即可。
演示:
外部类持有内部类对象。
代码:
那么,内部类持有外部类对象又如何得到呢?
2.使用new创建外部类对象
内部类持有外部类对象的第一种方式,也是大家最容易想到的方式,那就是new关键字。
演示:
使用new关键字在内部类中创建外部类对象。
代码:
Outer类:
Main类:
结果:
错误信息:
文字版:
Exception in thread "main" java.lang.StackOverflowErrorat lab.Outer$Inner.<init>(Outer.java:21)at lab.Outer.<init>(Outer.java:11)
堆栈内存溢出?怎么会这样?
我们明明只创建了一个外部类对象,怎么会有堆栈内存溢出?
错误代码基本上是在Outer.java这个文件的第21行代码和第11行代码循环,也就是说它们在相互无限调用。
外部类在创建内部类对象,内部类在创建外部类对象,当然得内存溢出,因为它们每创建出一个外部类对象或内部类对象,都要持有一个内部类对象或外部类对象,就这样无限循环创建下去,最后堆栈内存溢出。
既然我们要在内部类中持有外部类对象,那就把外部类里面持有内部类对象给注释掉。
再运行就没有错误了。
这里也提醒大家,以后千万不要这样写,特别是代码多的时候,你很有可能就书写了这样的代码。
3.使用this引用外部类对象
这里大家可能有些疑惑,为什么使用this关键字也能引用外部类对象?我们来看看。
演示:
使用this关键字引用外部类对象。
代码:
Outer类:
Main类:
结果:
程序运行正常,没有发现任何错误。
这里需要说明一下,为什么外部类类名.this可以创建对外部类的引用?
其实,当我们内部类在实例化对象时,内部会持有一个外部类的对象,所以外部类类名.this只是在编译时期就明确表示了出来。
总结
- 外部类持有内部类对象使用new关键字即可。
- 内部类持有外部类对象第一种方式使用new关键字。
- 内部类持有外部类对象第二种方式是外部类类名.this。
至此,Java中内部类持有外部类对象相关内容讲解先告一段落,更多内容请持续关注。
答疑
如果大家有问题或想了解更多前沿技术,请在下方留言或评论,我会为大家解答。
上一章
“全栈2019”Java第七十四章:内部类与静态内部类相互嵌套
下一章
“全栈2019”Java第七十六章:静态或非静态内部类访问权限
学习小组
加入同步学习小组,共同交流与进步。
- 方式一:关注头条号Gorhaf,私信“Java学习小组”。
- 方式二:关注公众号Gorhaf,回复“Java学习小组”。
全栈工程师学习计划
关注我们,加入“全栈工程师学习计划”。
版权声明
原创不易,未经允许不得转载!