静态和最终静态赋值
static and final static assignment
我使用的是同一种概念,我在第一个 class.
b 被初始化为 0,我在使用 b 的所有地方都得到 0。
一段时间后,我得到了原因,运行 调试器看到 a 没有被分配任何值,直到函数 call.variable a 只有值默认值 0.
但是当我 运行 class Test2.它给出了输出 5.
我想知道这个初始化是什么时候发生的?
我知道静态变量在编译时获得价值。但是静态最终呢?
这个变量什么时候得到它的值?
public class Test1 {
static int b=add();
static int add()
{
return a;
}
static int a=5;
public static void main(String[] args) {
System.out.println(b);
}
}
//Gives output 0
public class Test2 {
static int b=add();
static int add()
{
return a;
}
final static int a=5;
public static void main(String[] args) {
System.out.println(b);
}
}
//gives output 5
原始类型和String
类型的final static
字段由java编译器专门处理:它们是编译时常量。它们的值只是内联到它使用的代码中。让我们看一下生成的字节码。
Test1
class:
static int add();
Code:
0: getstatic #17 // Field a:I
3: ireturn
所以它真的加载了一个静态字段。
Test2
class:
static int add();
Code:
0: iconst_5
1: ireturn
这里它只是推送一个预定义的常量值5
,甚至没有引用常量字段。
来自 Java 语言规范的 12.4.2 部分,初始化 Class 的过程如下:
- Then, initialize the final class variables and fields of interfaces whose values are compile-time constant expressions (§8.3.2.1, §9.3.1,
§13.4.9, §15.28).
- Next, execute either the class variable initializers and static initializers of the class, or the field initializers of the
interface, in textual order, as though they were a single block.
因此最终变量将在静态变量之前被初始化。你会得到输出 5
.
只是为了补充其他答案:
在第一个 a
不是最终的情况下,b
的值在 a
之前赋值,这就是你得到 0 的原因。赋值顺序由语句的顺序。如果将 static int a=5;
移动到 b
的赋值语句之前,您将得到 5.
我使用的是同一种概念,我在第一个 class.
b 被初始化为 0,我在使用 b 的所有地方都得到 0。
一段时间后,我得到了原因,运行 调试器看到 a 没有被分配任何值,直到函数 call.variable a 只有值默认值 0.
但是当我 运行 class Test2.它给出了输出 5.
我想知道这个初始化是什么时候发生的? 我知道静态变量在编译时获得价值。但是静态最终呢? 这个变量什么时候得到它的值?
public class Test1 {
static int b=add();
static int add()
{
return a;
}
static int a=5;
public static void main(String[] args) {
System.out.println(b);
}
}
//Gives output 0
public class Test2 {
static int b=add();
static int add()
{
return a;
}
final static int a=5;
public static void main(String[] args) {
System.out.println(b);
}
}
//gives output 5
原始类型和String
类型的final static
字段由java编译器专门处理:它们是编译时常量。它们的值只是内联到它使用的代码中。让我们看一下生成的字节码。
Test1
class:
static int add();
Code:
0: getstatic #17 // Field a:I
3: ireturn
所以它真的加载了一个静态字段。
Test2
class:
static int add();
Code:
0: iconst_5
1: ireturn
这里它只是推送一个预定义的常量值5
,甚至没有引用常量字段。
来自 Java 语言规范的 12.4.2 部分,初始化 Class 的过程如下:
- Then, initialize the final class variables and fields of interfaces whose values are compile-time constant expressions (§8.3.2.1, §9.3.1, §13.4.9, §15.28).
- Next, execute either the class variable initializers and static initializers of the class, or the field initializers of the interface, in textual order, as though they were a single block.
因此最终变量将在静态变量之前被初始化。你会得到输出 5
.
只是为了补充其他答案:
在第一个 a
不是最终的情况下,b
的值在 a
之前赋值,这就是你得到 0 的原因。赋值顺序由语句的顺序。如果将 static int a=5;
移动到 b
的赋值语句之前,您将得到 5.