如果在java中的非静态类方法中创建对象会发生什么?

时间:2016-01-07 16:13:41

标签: java instance stack-overflow heap-memory local-variables

class Data {
    int x = 20; // instance variable

    public void show() // non-static method
    {
        Data d1 = new Data(); // object of same class Data
        int x = 10;
        System.out.println(x); // local x
        System.out.println(d1.x);// instance variable x
    }

    public static void main(String... args) {
        Data d = new Data();
        d.show(); // "10 20"
    }
}

所以我的问题是在show()中创建一个对象,即' d1' ,它必须有自己的一组数据成员,并且必须为其show()方法分配一个新的堆栈,作为回报,它应该创建一个新的对象,因此循环应该继续并发生堆栈溢出? 但这工作得很好??

2 个答案:

答案 0 :(得分:1)

您的show()方法只会被调用一次。在创建show()的实例时,不会调用Data。所以,你不会得到SOE。

尝试使用此代码获取SOE:P

class Data {
    int x = 20; // instance variable

    Data() {
        show(); // This will cause SOE
    }
    public void show() // non-static method
    {
        Data d1 = new Data(); // object of same class Data
        int x = 10;
        System.out.println(x); // local x
        System.out.println(d1.x);// instance variable x
    }

    public static void main(String... args) {
        Data d = new Data();
        d.show(); // "10 20"
    }
}

答案 1 :(得分:1)

Data d1=new Data(); 

此语句本身不会为show()分配新堆栈。 show()的堆栈仅在被调用时分配,例如,当它在main中被调用时。