1

我的代码:

(导致堆栈溢出错误)

public class Overloads {
    String uniqueID;    
    Overloads ov2=new Overloads();

    public static void main(String[] args) {
        System.out.println("IN MAIN");
    }

    public void setUniqueID(String theID) {
        // II lots of validation code, and then:
        uniqueID = theID;
        System.out.println(uniqueID);
    }
}

此代码工作正常:

public class Overloads {
    String uniqueID;   

    public static void main(String[] args) {
          Overloads ov2=new Overloads();
          System.out.println("IN MAIN");
    }

    public void setUniqueID(String theID) {
        // II lots of validation code, and then:
        uniqueID = theID;
        System.out.println(uniqueID);           
    }
}
4

2 回答 2

12

main 方法的存在与这里无关。但是,您声明变量的范围非常重要。

您是否了解过代码的第一个版本中发生的情况?

Create new instance of Overloads
  -> ov2 = Create new instance of Overloads
      -> ov2 = Create new instance of Overloads
         -> ov2 = Create new instance of Overloads

等等。该变量ov2在类的范围内,因此每当实例化类的实例时都会对其进行初始化。这将永远不会终止,直到您耗尽内存并导致堆栈溢出。使用调试器运行它以获得更清晰的视图。

Overloads代码的第二个版本只在 main 方法的范围内实例化了一个 的实例。因此创建一个实例不会导致新创建的实例创建新实例等等。

于 2013-10-07T07:30:44.230 回答
1

你可以这样做

public class Overloads {
    String uniqueID;
    static Overloads ov2 = new Overloads();

    public static void main(String[] args) {
        System.out.println("IN MAIN");
    }

    public void setUniqueID(String theID) {
        // II lots of validation code, and then:
        uniqueID = theID;
        System.out.println(uniqueID);
    }
}

这将创建重载的共享实例,实例化只会在类加载时完成一次

于 2013-10-07T07:54:57.747 回答