我的代码:
(导致堆栈溢出错误)
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);
}
}
答案 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的共享实例,实例化将只在类加载
时完成一次