日期:2014-05-20  浏览次数:20538 次

发现一个Java陷进,有兴趣的进来瞧瞧
我发现了个Java陷阱,虽说我自己知道了这是为什么,但是,在CSDN群里发布下,有兴趣的可回答,
答对给分:
public class A{
    private A a = new A();
    public A(){
         System.out.println("你好!");
    }
}
//测试类
public class test {
    public static void main(String[] args) {
     A s = new A();
    }
}

请问,1、程序的结果是什么?2、为什么?

------解决方案--------------------
这是什么陷阱,完全是对类对象实例化的过程不了解所致,对象在实例化的时候,会先初始化所有的成员变量,当然如果有父类的话,父类的成员是会先初始化的再初始化自身的成员变量,如果成员变量的初始化调用了方法,那么也会调用其方法,接着是成员代码块,接着才是执行构造函数(如果有父类还要执行父类的构造函数)。
放到楼主这里的运行顺序就是new A的时候初始化里面的成员变量a,但a又进行了A的实例化那么又要来一遍初始化A,也是一样的先初始化成员变量a,但a又进行了A的实例化那么又要来一遍初始化A。就这样无限递归下去了