博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
类内部实例化自身可行吗?
阅读量:4563 次
发布时间:2019-06-08

本文共 2533 字,大约阅读时间需要 8 分钟。

答案是不能。

事实证明,在类内部一直实例化自身会造成栈溢出,测试代码如下。

1 public class test1 { 2  3     /** 4      * @param args 5      */ 6     public static void main(String[] args) { 7         // TODO Auto-generated method stub 8         test1.A aa = new test1().new A(); 9         test1.A b = aa.getA();10         System.out.println("ok");11     }12 13     class A{14  15         private A a = new A();16         17         public A getA(){18            19             return a;20         }21     }22 }

结果:

1 exception in thread "main" java.lang.StackOverflowError 2     at test1$A.
(test1.java:13) 3 at test1$A.
(test1.java:15) 4 at test1$A.
(test1.java:15) 5 at test1$A.
(test1.java:15) 6 at test1$A.
(test1.java:15) 7 at test1$A.
(test1.java:15) 8 at test1$A.
(test1.java:15) 9 at test1$A.
(test1.java:15)10 at test1$A.
(test1.java:15)

 

但是如下的代码为何能够良好运行?

1 public class test1 { 2  3     /** 4      * @param args 5      */ 6     public static void main(String[] args) { 7         // TODO Auto-generated method stub 8         test1.A aa = new test1().new A(); 9         test1.A b = aa.getA();10         System.out.println("ok");11     }12 13     class A{14  15         private A a;16         17         public A getA(){18             a = new A();19             return a;20         }21     }22 }
这是因为,声明类,可以认为是在类内放一张空白纸,实例化是按照图纸造了一座房子,类内声明自己,只是放了一张A类型的图纸,并没有造房子,不会引起无限调用。 在函数中实例化类,必须调用函数才会执行,因此也不会引起无限调用,所以不会出现错误。 由此,还可以实现单例模式。 单例模式分为懒汉式和饿汉式 懒汉式:
1 public class test1 { 2  3     /** 4      * @param args 5      */ 6     public static void main(String[] args) { 7         // TODO Auto-generated method stub 8         test1.A aa = new test1().new A(); 9         test1.A b = aa.getA();10         System.out.println("ok");11     }12 13     class A{14  15         private A a = null;16         17         public A getA(){18             if(a == null)19                 a = new A();20             return a;21         }22     }23 }

饿汉式:

1 public class test1 { 2  3     /** 4      * @param args 5      */ 6     public static void main(String[] args) { 7         // TODO Auto-generated method stub 8         test1.A aa = new test1().new A(); 9         test1.A b = aa.getA();10         System.out.println("ok");11     }12 13     class A{14  15         private A a = new A();16         17         public A getA(){18             return a;19         }20     }21 }

懒汉式容易线成不安全,饿汉式加载占内存

转载于:https://www.cnblogs.com/feichangnice/p/9117962.html

你可能感兴趣的文章
【计算机视觉】双目测距(五)--匹配算法对比
查看>>
KMP模板
查看>>
luogu 1314 聪明的质检员
查看>>
[转载]求职者防骗必读!楼主亲身经历告诉你岗前培训多么不靠谱而且违法!
查看>>
Hibernate内存溢出分析一例
查看>>
基于Axis1.4的webservice接口开发(接口调用)
查看>>
Hive内置函数详解
查看>>
【转】MyEclipse快捷键大全
查看>>
IT职业技能图谱10--Hadoop家族技能图谱
查看>>
Java - 反射(1)
查看>>
控制台中显示执行的Sql语句
查看>>
Linux(Centos7)下搭建SVN服务器
查看>>
安卓开发的Tasks and Back Stack
查看>>
Ansi,UTF8,Unicode编码
查看>>
原子变量的性能问题
查看>>
Sybase PowerDesigner 15.0 完美版+特别文件
查看>>
快速傅立叶之二
查看>>
cetos 6.3 安装 apache+mysql+php
查看>>
js编写简单的贪吃蛇游戏
查看>>
2018/12/01 一个64位操作系统的实现 第四章 导入kernel.bin(4)
查看>>