Java中的对象初始化

时间:2015-10-09 11:21:48

标签: java constructor

请考虑以下代码。

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异常。为什么呢?

两种例外的理由是否相同?

5 个答案:

答案 0 :(得分:3)

你经历了一个循环,其中构造函数将其自行调用为servaral次,直到它溢出为止。

例如:

enter image description here

原因在两种情况都是一样的。它无休止地称之为自我。

在这两种情况下,只有一次区别是你提供了一个带有print语句的默认no org构造函数,这样你才能看到print语句,直到你得到错误

答案 1 :(得分:2)

每次创建Skyler的实例时,都会初始化该实例的s1成员,这将创建另一个Skyler实例,该实例初始化s1成员另一个实例,它创建了Skyler的另一个实例,依此类推......

换句话说,您对Skyler构造函数有无限的调用链,导致StackOverflowErr

答案 2 :(得分:1)

删除Skyler s1=new Skyler();。使用您的代码,Skyler类有一个类型为Skyler的变量,然后它会一次又一次地创建一个Skyler,因此StackOverflowException存在。

答案 3 :(得分:1)

检查逻辑,你创建一个新的Skyler,这是做什么的?它创建了一个新的Skyler,令人惊讶的是,这个新Skyler创建了另一个新的Skyler。这一切都来自您的行Skyler s1=new Skyler();(非静态的),它会递归地创建对象Skyler的endles实例。

答案 4 :(得分:1)

Skyler类调用自己的构造函数。因此,在创建Skyler的实例时,会创建另一个Skyler实例,依此类推......结果是StackOverflow。