如何在Java中初始化字段变量?
我试图运行此程序,但这会导致运行时错误StackOverflower错误。如果在类Static中我将引用对象ob设置为Static,则不会发生错误。有谁能解释一下为什么会发生这种情况,请解释一下字段变量是静态的还是非静态的,引用变量还是非引用变量是初始化的如何在Java中初始化字段变量?,java,Java,我试图运行此程序,但这会导致运行时错误StackOverflower错误。如果在类Static中我将引用对象ob设置为Static,则不会发生错误。有谁能解释一下为什么会发生这种情况,请解释一下字段变量是静态的还是非静态的,引用变量还是非引用变量是初始化的 public class Static { public Static ob = new Static(); private int a; public void win(Static obj) {
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,更改这个名称,它没有告诉类的目的,实际上是非常误导的。