“全栈2019”Java第七十五章:内部类持有外部类对象

105 阅读3分钟
原文链接: www.toutiao.com

难度

初级

学习时间

10分钟

适合人群

零基础

开发语言

Java

开发环境

  • JDK v11
  • IntelliJ IDEA v2018.3

提示

本教学属于系列教学,内容具有连贯性,本章使用到的内容之前教学中都有详细讲解。

1.外部类持有内部类对象

通常,我们外部类持有内部类对象,只需将new一个内部类对象即可。

演示:

外部类持有内部类对象。

代码:

“全栈2019”Java第七十五章:内部类持有外部类对象

那么,内部类持有外部类对象又如何得到呢?

2.使用new创建外部类对象

内部类持有外部类对象的第一种方式,也是大家最容易想到的方式,那就是new关键字。

演示:

使用new关键字在内部类中创建外部类对象。

代码:

Outer类:

“全栈2019”Java第七十五章:内部类持有外部类对象

Main类:

“全栈2019”Java第七十五章:内部类持有外部类对象

结果:

“全栈2019”Java第七十五章:内部类持有外部类对象

错误信息:

“全栈2019”Java第七十五章:内部类持有外部类对象

文字版:

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行代码循环,也就是说它们在相互无限调用。

“全栈2019”Java第七十五章:内部类持有外部类对象

外部类在创建内部类对象,内部类在创建外部类对象,当然得内存溢出,因为它们每创建出一个外部类对象或内部类对象,都要持有一个内部类对象或外部类对象,就这样无限循环创建下去,最后堆栈内存溢出。

既然我们要在内部类中持有外部类对象,那就把外部类里面持有内部类对象给注释掉。

“全栈2019”Java第七十五章:内部类持有外部类对象

再运行就没有错误了。

这里也提醒大家,以后千万不要这样写,特别是代码多的时候,你很有可能就书写了这样的代码。

3.使用this引用外部类对象

这里大家可能有些疑惑,为什么使用this关键字也能引用外部类对象?我们来看看。

演示:

使用this关键字引用外部类对象。

代码:

Outer类:

“全栈2019”Java第七十五章:内部类持有外部类对象

Main类:

“全栈2019”Java第七十五章:内部类持有外部类对象

结果:

“全栈2019”Java第七十五章:内部类持有外部类对象

程序运行正常,没有发现任何错误。

这里需要说明一下,为什么外部类类名.this可以创建对外部类的引用?

其实,当我们内部类在实例化对象时,内部会持有一个外部类的对象,所以外部类类名.this只是在编译时期就明确表示了出来。

总结

  • 外部类持有内部类对象使用new关键字即可。
  • 内部类持有外部类对象第一种方式使用new关键字。
  • 内部类持有外部类对象第二种方式是外部类类名.this。

至此,Java中内部类持有外部类对象相关内容讲解先告一段落,更多内容请持续关注。

答疑

如果大家有问题或想了解更多前沿技术,请在下方留言或评论,我会为大家解答。

上一章

“全栈2019”Java第七十四章:内部类与静态内部类相互嵌套

下一章

“全栈2019”Java第七十六章:静态或非静态内部类访问权限

学习小组

加入同步学习小组,共同交流与进步。

  • 方式一:关注头条号Gorhaf,私信“Java学习小组”。
  • 方式二:关注公众号Gorhaf,回复“Java学习小组”。

全栈工程师学习计划

关注我们,加入“全栈工程师学习计划”。

“全栈2019”Java第七十五章:内部类持有外部类对象

版权声明

原创不易,未经允许不得转载!