【问题标题】:What does static keyword do here? [duplicate]static 关键字在这里做什么? [复制]
【发布时间】:2019-01-25 11:07:48
【问题描述】:

我是java初学者。我正在尝试这段代码,我在类本​​身中创建了类的实例。

它给了我堆栈溢出错误。 然后,我在类中将引用变量设为“静态”,现在它工作正常。

我的问题是静态关键字在这里做什么?我知道静态变量是只加载一次的类变量。但是,构造函数调用是否也应该进入对自身的递归调用?我无法从我对静态关键字的了解中得到任何答案。

【问题讨论】:

标签: java static


【解决方案1】:

你有类似的东西(不能复制/粘贴屏幕截图!)

 class A {
     private A a = new A();
 }

所以当你调用new A() 时要创建A 的实例,它必须通过再次调用new A() 来设置this.a 的值。无限递归(直到堆栈空间用完)。

当您将该字段 a 设为静态时,在构造 A 的实例时将不再初始化它,而在加载类本身时只会初始化一次。

【讨论】:

  • 感谢您的回答。但是,我仍然有我的疑问。根据java,静态引用变量'a'在类加载时被实例化。那么,我的问题是:为什么它不像实例变量那样在那个时候进入无限递归?我问这个是因为当我运行 'System.out.print(D1.obj.obj.d);' )。它给了我答案:19,据我说,这意味着静态引用变量“obj”包含另一个引用变量“obj”,很像无限递归。
  • 调用new A()时不会进入递归,因为构造函数中不再涉及递归调用。 D1.obj.obj 还应该给您一个编译器警告,因为通过对象实例访问静态字段 obj 会产生误导。 D1.objD1.obj.obj(和 D1.obj.obj.obj)都指向同一个实例。
  • 非常感谢。虽然,我研究过静态关键字。但是,您能给我一些链接,以便我深入了解静态引用变量吗?
【解决方案2】:

当类被初始化并且它有一个自己类型的成员时,成员本身被初始化为内部相同的成员,并且该成员内部的这个成员被初始化......你看到这里的无限递归了吗?这就是你得到堆栈溢出错误的原因。

static 关键字使该成员不属于类。它在全局上下文中初始化一次(例如,您不需要 D1 的实例来访问它。您键入 D1.obj 代替)。所以这里不会发生递归。

【讨论】:

    猜你喜欢
    • 2020-11-25
    • 2012-07-16
    • 2014-06-06
    • 1970-01-01
    • 2011-06-04
    • 2019-08-15
    • 1970-01-01
    • 2016-06-02
    相关资源
    最近更新 更多