[英]Object initialization in Java
考虑以下代码。
public class Skyler {
Skyler s1=new Skyler();
public static void main(String asd[]){
Skyler s2=new Skyler();
}
}
它生成java.lang.StackOverflowError
异常。 为什么?
请考虑以下代码。
public class Skyler {
Skyler s1=new Skyler();
static Skyler s2=new Skyler();
Skyler(){
System.out.println("const");
}
public static void main(String sdp[]){}
}
这也会生成相同的java.lang.StackOverflowError
异常。 为什么?
这两个例外的理由是否相同?
每次创建Skyler
实例时,都会初始化该实例的s1
成员,这将创建另一个Skyler
实例,该实例初始化该另一个实例的s1
成员,从而创建另一个Skyler
实例,依此类推......
换句话说,您对Skyler
构造函数有一个无限的调用链,这会导致StackOverflowErr
。
删除Skyler s1=new Skyler();
。使用你的代码,Skyler类有一个类型为Skyler的变量,然后它会一次又一次地创建一个Skyler,所以存在StackOverflowException
。
检查逻辑,你创建一个新的Skyler
,这有什么作用? 它创造了一个新的Skyler
,令人惊讶的是这个新的Skyler
创造了另一个新的Skyler
。 这一切都来自你的线Skyler s1=new Skyler();
(非静态的那个),它递归地创建了Object Skyler
endles实例。
Skyler类调用自己的构造函数。 因此,在创建Skyler的实例时,会创建另一个Skyler实例,依此类推......结果是StackOverflow。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.