考虑以下2个程序给出相同的错误
First calss:
public class Testing {
Testing t=new Testing();
public static void main(String args[]){
testing t1=new testing();
}
}
Run Code Online (Sandbox Code Playgroud)
二等:
class foo{
void baz(){
new testing();
}
}
public class testing {
testing t=new testing();
public static void main(String args[]){
foo f=new foo();
f.baz();
}
}
Run Code Online (Sandbox Code Playgroud)
上面的代码如何给出以下错误?
我知道类的实例是递归创建但我想知道如何?
Exception in thread "main" java.lang.StackOverflowError
at com.Testing.<init>(Testing.java:4)
at com.Testing.<init>(Testing.java:4)
Run Code Online (Sandbox Code Playgroud)
如果我们这样做,为什么不这样呢?
public class testing {
testing t2=new testing();
testing t1=new testing();
public static void main(String args[])
{//anything}
}
Run Code Online (Sandbox Code Playgroud)
因为t1将要求t2对象被初始化,反之亦然?
这就是问题:
public class Testing {
Testing t=new Testing();
}
Run Code Online (Sandbox Code Playgroud)
这大致相同:
public class Testing {
Testing t;
public Testing() {
t = new Testing();
}
}
Run Code Online (Sandbox Code Playgroud)
这使得递归更加清晰 - 构造函数无条件地调用自身.
每个实例都Testing包含对另一个实例的引用Testing.这不一定是个问题 - 但它就在这里,因为它正在创建一个新的实例Testing.因此,创建"最外层"实例会立即触发另一个实例的创建...这会触发创建另一个实例,等等.
在这方面,您的两个类没有显着差异 - 创建任何实例Testing都会导致堆栈溢出.
编辑:关于此代码(名称和格式改进):
public class Testing {
Testing t1 = new Testing();
Testing t2 = new Testing();
public static void main(String[] args) {
//anything
}
}
Run Code Online (Sandbox Code Playgroud)
会如果您尝试创建的实例仍然抛出同样的异常Testing.你说't1将需要t2对象进行初始化'是错误的 - 这里的变量之间没有相互依赖关系.每个变量初始化创建一个单独的对象......但每次的那些对象将依次尝试创建的两个实例Testing.
需要注意的是实例Testing是不以运行所需的main方法-但如果该main方法调用要么new Testing直接,或调用一些别的这就要求new Testing(),那么你会得到堆栈溢出.
| 归档时间: |
|
| 查看次数: |
1097 次 |
| 最近记录: |