一直很想试验一下对象创建时候两个类循环调用会用什么后果,今天做了一下,果然和想象的一下,下面贴出自己的实验代码:
实验中总共需要三个类:
第一个类:
1 public class Test_A {
2 public Test_A(){
3 Test_B b = new Test_B();
4 System.out.println("A is created!");
5 }
6 }
第二个类:
1 public class Test_B {
2 public Test_B(){
3 Test_A b = new Test_A();
4 System.out.println("B is created!");
5 }
6 }
上面两个类在实例化的时候都需要实例化对方,也就说这里形成了循环调用,下面看看测试类:
1 public class Test {
2 public static void main(String[] args) {
3 // TODO Auto-generated method stub
4 Test_A a = new Test_A();
5 }
6 }
大家现在可以猜一猜实验运行结果(昨天看到一片帖子也是说这个问题的,当时有人说不会出现循环调用)
一下是在Eclipse中的实验结果:
Exception in thread "main" java.lang.StackOverflowError
at Test_B.<init>(Test_B.java:4)
at Test_A.<init>(Test_A.java:4)
at Test_B.<init>(Test_B.java:4)
at Test_A.<init>(Test_A.java:4)
at Test_B.<init>(Test_B.java:4)
at Test_A.<init>(Test_A.java:4)
at Test_B.<init>(Test_B.java:4)
at Test_A.<init>(Test_A.java:4)
at Test_A.<init>(Test_A.java:4)
at Test_B.<init>(Test_B.java:4)
at Test_A.<init>(Test_A.java:4)
at Test_B.<init>(Test_B.java:4)
at Test_A.<init>(Test_A.java:4)
at Test_B.<init>(Test_B.java:4)
at Test_A.<init>(Test_A.java:4)
at Test_B.<init>(Test_B.java:4)
at Test_A.<init>(Test_A.java:4)
at Test_B.<init>(Test_B.java:4)
at Test_A.<init>(Test_A.java:4)
at Test_B.<init>(Test_B.java:4)
at Test_A.<init>(Test_A.java:4)
at Test_B.<init>(Test_B.java:4)
整个输出窗口全部被占满
和预期的一样,真的产生了循环调用,并且出现了栈溢出异常!!