gpt4 book ai didi

java - Java 类变量的初始化顺序是什么?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:11:44 25 4
gpt4 key购买 nike

我最近遇到了这些问题,但在 StackOverflow 上找不到答案;

  1. Java 类变量的初始化顺序是什么?
  2. 还有一个有点相关的问题,重新排序变量会改变类行为吗?
  3. 为什么?

根据 Meta 上的建议我将发布我对这个问题的回答。

最佳答案

在 Java 中,类变量在 following order 中初始化:

  1. 父类(super class)的静态变量
  2. 这个类的所有静态变量都设置为它们的default values .
  3. 声明顺序中的静态变量和静态初始化 block 。
  4. 你的父类(super class)的实例变量
  5. 这个类的所有实例变量都设置为它们的 default values .
  6. 实例变量和实例级初始化 block ,按声明顺序

1 和 2 仅在第一次实例化类时完成。

因此,给定以下代码:

class Test
extends TestSuper
{
final int ti1;
final int ti2 = counter ++;
{ ti1 = counter ++; }
static final int ts1;
static final int ts2 = counter ++;
static { ts1 = counter ++; }

public static void main(String[] argv) {
Test test1 = new Test();
printTest(test1);
Test test2 = new Test();
printTest(test2);
}
private static void printTest(Test test) {
System.out.print("ss2 = " + test.ss2);
System.out.print(", ss1 = " + test.ss1);
System.out.print(", ts2 = " + test.ts2);
System.out.println(", ts1 = " + test.ts1);
System.out.print("si2 = " + test.si2);
System.out.print(", si1 = " + test.si1);
System.out.print(", ti2 = " + test.ti2);
System.out.println(", ti1 = " + test.ti1);
System.out.println("counter = " + test.counter);
}
}

class TestSuper
{
static int counter = 0;
final int si1;
final int si2 = counter ++;
{ si1 = counter ++; }
static final int ss1;
static final int ss2 = counter ++;
static { ss1 = counter ++; }
}

然后我们得到如下输出:

ss2 = 0, ss1 = 1, ts2 = 2, ts1 = 3
si2 = 4, si1 = 5, ti2 = 6, ti1 = 7
counter = 8
ss2 = 0, ss1 = 1, ts2 = 2, ts1 = 3
si2 = 8, si1 = 9, ti2 = 10, ti1 = 11
counter = 12

从这个输出中我们可以看到字段是按照列表中指定的顺序初始化的。

现在,关于第二个问题,重新排序字段是否可以改变类行为。是的,通过重新排序字段,您可以更改字段的初始化顺序。现在,在所有字段都是独立的特定情况下,这不会影响观察到的行为,但是只要字段不是独立的,例如在上面的代码中,那么重新排序字段可能会改变它们的初始化值。

例如,如果三行:

  static final int ss1;
static final int ss2 = counter ++;
static { ss1 = counter ++; }

更改为:

  static final int ss1;
static { ss1 = counter ++; }
static final int ss2 = counter ++;

然后输出将变为:

ss2 = 1, ss1 = 0, ts2 = 2, ts1 = 3
si2 = 4, si1 = 5, ti2 = 6, ti1 = 7
counter = 8

也就是说,ss2ss1会改变值。

原因是此行为在 Java Language Specification 中指定。 .

关于java - Java 类变量的初始化顺序是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2138801/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com