加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 为什么最终的静态变量不能在实例块中赋值?

发布时间:2020-12-15 04:26:28 所属栏目:Java 来源:网络整理
导读:class Test { static final String name; { name = "User"; /* shows error. As i have to assign User as default value */ } final String name1; { name1 = "User"; // This works but why the above one does not works }} 我能够使用静态块分配值,但不
class Test {
    static final String name;

    {    
        name = "User"; 
        /* shows error. As i have to assign User as default value */
    }
    final String name1;

    {
       name1 = "User"; // This works but why the above one does not works
    }
}

我能够使用静态块分配值,但不能通过实例阻止为什么?

解决方法

因为它是静态final,所以它必须在静态上下文中初始化一次 – 声明变量时或在 static initialization block中.

static {    
    name = "User";
}

编辑:静态成员属于该类,非静态成员属于该类的每个实例.如果要在实例块中初始化静态变量,则每次创建该类的新实例时都会初始化它.这意味着它在此之前不会被初始化,并且可以多次初始化.由于它是静态的和最终的,因此必须初始化一次(对于该类,而不是每个实例一次),因此您的实例块将不会.

也许您想在Java中更多地了解static vs. non-static variables.

EDIT2:以下是可能有助于您理解的示例.

class Test {
    private static final int a;
    private static int b;
    private final int c;
    private int c;

    // runs once the class is loaded
    static {
        a = 0;
        b = 0;
        c = 0;  // error: non-static variables c and d cannot be
        d = 0;  // referenced from a static context
    }

    // instance block,runs every time an instance is created
    {
        a = 0;  // error: static and final cannot be initialized here
        b = 0;
        c = 0;
        d = 0;
    }
}

所有未注释的行都有效.如果我们有

// instance block
    {
        b++; // increment every time an instance is created
        // ...
    }

然后b将作为创建的实例数的计数器,因为它是静态的并且在非静态实例块中递增.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读