为什么我不能在没有main方法的情况下实例化和创建Object? (堆栈溢出错误)

时间:2013-10-07 07:23:27

标签: java

我的代码:

(导致堆栈溢出错误)

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);           
    }
}

2 个答案:

答案 0 :(得分:11)

主要方法的存在与此无关。但是,声明变量的范围非常重要。

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

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

等等。变量ov2在类的范围内,因此只要实例化类的实例,它就会被初始化。这将永远不会终止,直到你的内存不足并导致堆栈溢出。使用调试器运行它以获得更清晰的视图。

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

答案 1 :(得分: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);
    }
}

这将创建Overloads的共享实例,实例化将只在类加载

时完成一次