今天用递归的时候,从递归的问题(方法调用自己本身可能会出现栈内存溢出),联想到如果一个对象创建自己本身,会不会也出现堆内存溢出。
于是写了个小测试。
/**
* 如果类中的构造方法是创建本类的对象,会堆内存溢出
* java.lang.StackOverflowError
*
*/
public class Test {
private Test t;
Test(){
this.t = new Test();
}
public static void main(String[] args) {
Test t = new Test();
}
}
控制台输出异常确实是内存溢出,但是这和我一开始的想法不一样啊,怎么会是栈内存溢出呢。。。
Exception in thread "main" java.lang.StackOverflowError
at practice.Test.<init>(Test.java:13)
at practice.Test.<init>(Test.java:13)
at practice.Test.<init>(Test.java:13)
at practice.Test.<init>(Test.java:13)
at practice.Test.<init>(Test.java:13)
...
大概思考了下这个程序的执行流程:
1.main方法创建了一个Test类的对象,这个类的无参构造被执行
2.无参构造中又创建了一个Test对象,创建的时候又是执行了无参构造。
3.第二步一直无限的执行下去。。。
于是内存就溢出了。
话说。。。实际开发里面肯定不会有这种麻瓜的构造方法的。这个测试大概也没啥实际意义。