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将作为创建的实例数的计数器,因为它是静态的并且在非静态实例块中递增. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |