Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中初始化字段变量?_Java - Fatal编程技术网

如何在Java中初始化字段变量?

如何在Java中初始化字段变量?,java,Java,我试图运行此程序,但这会导致运行时错误StackOverflower错误。如果在类Static中我将引用对象ob设置为Static,则不会发生错误。有谁能解释一下为什么会发生这种情况,请解释一下字段变量是静态的还是非静态的,引用变量还是非引用变量是初始化的 public class Static { public Static ob = new Static(); private int a; public void win(Static obj) {

我试图运行此程序,但这会导致运行时错误StackOverflower错误。如果在类Static中我将引用对象ob设置为Static,则不会发生错误。有谁能解释一下为什么会发生这种情况,请解释一下字段变量是静态的还是非静态的,引用变量还是非引用变量是初始化的

public class Static {

    public Static ob = new Static();
    private int a;

    public void win(Static obj) {
        //System.out.printf("ob.a = %d\n", ob.a);
        obj.a = 15;
        System.out.printf("ob.a = %d", ob.a);
    }
}

public class StaticTest {

    public static void main(String args[])
    {
        Static obj=new Static();
        //Static obj1=new Static();

        // obj.win(obj1.ob);
    }
}

每次实例化一个静态类的对象时,名称非常混乱,顺便说一句,您创建一个静态对象并实例化它,这将创建另一个静态对象并实例化它,以此类推。。。因此会出现StackOverflow错误:

public Static ob = new Static();
对于类的所有实例,静态字段初始化一次。这就是为什么将类型更改为static会阻止它无限递归的原因

当该字段不是静态的时,您会创建一个无限递归,从而导致堆栈溢出;当您实例化对象时,它会实例化另一个对象,这会实例化另一个对象,依此类推

静态是类级别的,因此当类第一次加载到内存中时,它被初始化。静态块也是按声明顺序初始化的

与之相反,类变量是非静态的,并且在创建该类的对象时是init,我相信不是以任何特定的顺序

在您的情况下,如果您不使ob为静态,它将尝试初始化静态类对象,当尝试初始化ob时,它将再次创建另一个静态,因为它调用newstatic,这将一直持续到堆栈StackoverFlow用完为止


如果将ob设置为static,则当静态类加载到内存中时,这只会初始化一次,这样就可以继续了。

您的代码将创建静态类的实例。 创建实例时,将初始化它们的属性。代码所做的是初始化“ob”属性,并指向一个新的静态实例。 然后创建静态类的新实例,并且。。。您有一个无限的初始化循环

如果将“static”keyworkd附加到属性,则创建的是类属性,即该类的所有实例之间共享的属性。 这意味着当您执行代码并创建静态的第一个实例时,JAva将初始化ob属性。Static的后续实例不会初始化它,因为它在所有实例之间共享


请参阅此示例:

如果创建字段的实例级别,将导致无休止的递归,最终导致堆栈溢出内存错误


另一方面,如果将字段定义为静态字段,则避免递归,因为静态字段变量属于类,而不是对象实例。JVM中的类只创建一次,而对象实例可能很多。

我支持静态注释…非常令人困惑的名称。顺便说一句,谢谢大家。我已经意识到我的错误。class Static,更改这个名称,它没有告诉类的目的,实际上是非常误导的。