轮“套娃”的实力,还是应该数得上那群“种花家”的“流氓兔”,钓上来“鹰酱”,实现三个愿望,“我要小钱钱和小钱钱、然后再来三个愿望”。典型的“耍流氓”,不过对于“鹰酱”这样的真正的流氓,耍一耍真倒也没什么。

那兔“流氓”套娃

这里探讨一下 Java 中的“套娃”

1、最基本的“套娃”:在一个类中的成员变量实例化该类

第一种情况:“套娃”导致java.lang.StackOverflowError

public class TaoWa {

private String name;

private String country;

private TaoWa taoWa = new TaoWa("流氓兔", "种花家");

public TaoWa() {}

public TaoWa(String name, String country) {

this.name = name;

this.country = country;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getCountry() {

return country;

}

public void setCountry(String country) {

this.country = country;

}

}

public class Main {

public static void main(String[] args) {

TaoWa taoWa = new TaoWa("鹰酱", "美利坚");

}

}

在类TaoWa中我们new出了一个TaoWa,来自“种花家”的“流氓兔”,但是在Main真正执行的时候,我们是new了一个“美利坚鹰酱”的TaoWa对象。可能凭空想是想不明白,那么画图来告诉说明为什么“套娃”最后引发了StackOverflowError。

一个类中普通成员变量实例化该类对象“套娃”

从上面的图就能比较明显看出,在堆中会有不断有新的“流氓兔”出现,无限进行下去,最终导致 Stack Overflow 。

第二种情况:“套娃”有讲究

在上面的例子中,我们见识到了“套娃”的“疯狂”,但是,并不是说 Java 不允许我们“套娃”,因为“套娃”这种东西是有用的,尤其在一些考虑到安全的问题,比如实现“单例”等场景。

既然允许“套娃”,那么应该怎么处理?

用static关键字修饰那个实例化本类对象的成员变量。

public class TaoWa {

private String name;

private String country;

private static TaoWa taoWa = new TaoWa("流氓兔", "种花家");

public TaoWa() {}

public TaoWa(String name, String country) {

this.name = name;

this.country = country;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getCountry() {

return country;

}

public void setCountry(String country) {

this.country = country;

}

public static TaoWa getTaoWa() {

return taoWa;

}

@Override

public String toString() {

return "TaoWa{" +

"name='" + name + '\'' +

", country='" + country + '\'' +

'}';

}

}

public class Main {

public static void main(String[] args) {

TaoWa taoWa = new TaoWa("鹰酱", "美利坚");

System.out.println(taoWa.getTaoWa());

}

}

输出:

TaoWa{name='流氓兔', country='种花家'}

同样,用图的方法说一说为什么这样“套娃”是可以的。

一个类中成员变量实例化该类对象“套娃”

一旦把实例化本类对象的成员变量用static修饰,那么它属于类层级而不是属于对象层级,在这种情况下,虽然从代码上看起来我们进行了“套娃”,但是实际上在内存中,并没有同第一种情况那样“无限”的“流氓兔”出现,所以这样的情况下,是不会引发 Stack Overflow 的。

总结:

这里的“套娃”是指代码上所体现的一种形式,就是“一个类中的成员变量去实例化该类”,给人一层套一层的感觉,但是在内存中的体现,并不一定是给人“套娃”的感觉。

java 套娃_论“套娃”相关推荐

  1. 数学分析闭区间套定理_闭区间套定理的介绍及其应用

    本次内容主要适合数学系院系的学生,非数学系的同学可以从略. 但因后续介绍函数连续性一些性质的证明时常需要用到,故笔者还是推荐非数专业的同学们了解一下,这将有助于同学们更加深刻的理解那些性质背后的意义. ...

  2. 数学分析闭区间套定理_闭区间套定理在数学教学中的一个有趣应用

    龙源期刊网 http://www.qikan.com.cn 闭区间套定理在数学教学中的一个有趣应用 作者:宣渭峰 来源:<青年与社会> 2018 年第 30 期 摘 要:实数集的不可数性在 ...

  3. 真香,50行Java代码爬取妹子套图!

    前言 当一个代码的工匠回首往事时,不因虚度年华而悔恨,也不因碌碌无为而羞愧,这样,当他老的时候,可以很自豪告诉世人,我曾经将代码注入生命去打造互联网的浪潮之巅,那是个很疯狂的时代,我在一波波的浪潮上留 ...

  4. java web学习项目20套源码完整版

    java web学习项目20套源码完整版 自己收集的各行各业的都有,这一套源码吃遍所有作业项目! 1.BBS论坛系统(jsp+sql) 2.ERP管理系统(jsp+servlet) 3.OA办公自动化 ...

  5. java习题8,java试题练习题(第8套

    <java试题练习题(第8套>由会员分享,可在线阅读,更多相关<java试题练习题(第8套(9页珍藏版)>请在人人文库网上搜索. 1.班级: 姓名: 学号: 试题共 页 加白纸 ...

  6. 我来自台湾:普力600 消毒锭_普力-600 消毒片PL-600 SH-XT-K礼盒小套组_易迅发现_易迅网...

    我来自台湾:普力600 消毒锭_普力-600 消毒片PL-600 SH-XT-K礼盒小套组_易迅发现_易迅网

  7. 被动套接字 主动套接字_了解网络套接字及其可能性

    被动套接字 主动套接字 介绍 (Introduction) As users of web applications, we are accustomed to being able to quick ...

  8. 柯桥有了高级西服定制机构上万元的西服已订出10多套(图)_网易新闻中心

    柯桥有了高级西服定制机构上万元的西服已订出10多套(图)_网易新闻中心 柯桥有了高级西服定制机构上万元的西服已订出10多套(图)_网易新闻中心 柯桥有了高级西服定制机构上万元的西服已订出10多套(图) ...

  9. 板材开料最优算法_板材套料软件AutoNest与Tekla Structures协同工作实现设计到加工自动化...

    板材套料软件AutoNEST与Tekla Structures协同工作实现设计到加工自动化 摘要: 企业应该开始考虑 Tekla Structures 软件如何能应用到其他的部门以及其他的项目生产流程 ...

最新文章

  1. NoSQL介绍(三)
  2. 计算机二级2021辅导书,2021该如何准备计算机二级考试?
  3. 大话synchronize底层原理
  4. 神兽来了服务器维护,20191204维护公告解读
  5. java 加日志_java中添加日志
  6. 【渝粤题库】陕西师范大学200471 英汉翻译
  7. sci写作sci写作模板_2020年写作主题
  8. docker mysql8
  9. hadoop完全分布式集群下安装sqoop
  10. vue-pdf安装之后,运行报错can not resolve ‘pdfjs-dist/es5/web/pdf_viewer‘
  11. word html 预览 打印出来,word打印预览显示全,但是打印出来不全
  12. 在腾讯开发QQ IM 的工作体验
  13. 【教程】创建活动报名二维码(活动报名/会议签到扫码,带微信手机号认证)
  14. Android实战技巧之三十四:用TableLayout伪装表格显示数据
  15. 华为手机传感器测试软件,华为P8拍摄能力测试 IMX278传感器到底魅力何在
  16. 学生的数学学习应当是一个生动活泼,积极主动和富有个性的过程,认真听讲,积极思考,动手实践,自主 探索,合作交流等都是学习数学的主要方式,请谈谈教师如何在教学中帮助学生养成良好的数学学习习惯(论述))
  17. 认证授权那点事儿 —— OAuth 2.0
  18. php根据URL获得网页内容
  19. Redis分布式中间件TwemProxy
  20. The Annotated Diffusion Model(翻译)

热门文章

  1. Linux脚本的制作命令
  2. 潜入浅出--通信中的频带利用率,以MASK.MPSK作为例子
  3. 基于若依系统进行模块化开发(使用eclipse)
  4. 网易2017校园招聘笔试题 优雅的点
  5. 计算机应用基础0006 19春在线作业2,《计算机应用基础0006》19春在线作业 参考资料...
  6. MySQL定时任务(EVENT|事件)如何配置,必会技能!
  7. Kinect for Windows SDK 1.6的改进及新特性
  8. 常见的随机变量分布律/概率密度、期望、方差以及特征函数
  9. 从FPGA到ACAP,“万能芯片”蝶变转型
  10. python 词云学习