初始化时静态引用变量和实例引用变量有什么区别?

朴哲路

我对Java中的基本内容感到困惑。

public class InitItself1 {

    public InitItself1(){}

    private InitItself1 me = new InitItself1();
}

当然,我知道在创建上述类的实例时会发生StackOverFlowError。由于变量“ me”的启动,上述类本身将以递归方式启动。

但,

public class InitItself2 {

    public InitItself2(){}

    private static InitItself2 me = new InitItself2();
}

当然,以上类“ InitItself2”的结果与上一类“ InitItself1”不同。这工作得很好,没有发生错误。据我所知,当加载了静态变量和块的类时,将执行初始化静态变量和执行静态块的操作。

让我感到困惑的是,我认为两个类“ InitItself1”和“ InitItself2”的变量“ me”都是相同的,并且它们都引用了它们所在的类,因此看起来“递归启动”将在启动两个类时发生。

我想念的是什么?请给我一个好的答案。谢谢 :)

无屏幕名称

在第二种情况下,您不会得到StackOverFlowError。就像您自己说的那样,静态变量是在类加载时启动的,并且由于类仅加载一次,因此静态InitItself2 me实例仅被实例化一次。使用构造函数创建新对象不需要重新加载该类。

public final class InitItself {

    static {
        System.out.println("Class is loaded");
    }

    private static InitItself me = new InitItself();

    static {
        System.out.println("me is instantiated");
    }

    public InitItself() {
        System.out.println("Constructor called, me=" + me);
    }

    public static void main(String[] args) {
        System.out.println("START");
        InitItself i = new InitItself();
        System.out.println("FINISH");
    }
}

提供以下输出

Class is loaded
Constructor called, me=null
me is instantiated
START
Constructor called, me=oop.InitItself@6ff3c5b5
FINISH

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

块中引用的实例变量和临时变量之间有什么区别?

如何在c中全局初始化变量,静态和外部有什么区别?

在构造函数内外初始化实例变量之间有什么区别?

变量初始化有什么区别?

类变量和实例变量之间有什么区别?

变量赋值和通过引用传递之间有什么区别?

在Perl中使用\和{},[]引用变量之间有什么区别?

Java中的指针和引用变量之间有什么区别?

引用对象的变量ID和使用'this'之间有什么区别吗?

模板引用变量(角度2)中的ref-前缀和#有什么区别?

在实例变量初始化时初始化实例变量

字符串初始化时“ =“和“ =>”之间有什么区别

静态和非静态初始化代码块有什么区别

快速初始化和便捷实例之间的便利初始化与初始化之间有什么区别

那互相引用的静态变量初始化?

C初始化程序元素不是常量[数组和变量之间有什么区别]

如果未初始化对象,静态方法/变量在Java中实际引用什么?

错误:静态解析符号值时遇到错误。只能引用初始化的变量和常量

在 C++ 中,文字 3 和取消引用值为 3 的变量的结果有什么区别?

编写静态const uint变量和匿名枚举变量有什么区别?

静态成员变量和名称空间变量有什么区别?

变量和参数有什么区别

Java中的局部变量和实例变量有什么区别

静态实例变量引用该类的实例

用户变量和系统变量之间有什么区别?

变量 === 常量和常量 === 变量有什么区别

(cast)变量和((cast)变量)有什么区别

“ $(变量)”和“ $(变量)”之间有什么区别

PLSQL Bind变量和Host变量有什么区别