Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java类变量的初始化顺序是什么?_Java - Fatal编程技术网

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

Java类变量的初始化顺序是什么?,java,Java,我最近遇到这些问题,在StackOverflow上找不到答案 Java类变量的初始化顺序是什么 还有一个稍微相关的问题,变量的重新排序会改变阶级行为吗 为什么? 正如上所建议的,我将发布我对这个问题的答案。在Java中,类变量在以下位置初始化: 超类的静态变量 该类的所有静态变量都设置为它们的 静态变量和静态初始化块,按声明顺序 超类的实例变量 该类的所有实例变量都设置为它们的值 实例变量和实例级初始化块,按声明顺序 1和2仅在类第一次实例化时执行 因此,考虑到以下代码: class Test

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

  • Java类变量的初始化顺序是什么
  • 还有一个稍微相关的问题,变量的重新排序会改变阶级行为吗
  • 为什么?

  • 正如上所建议的,我将发布我对这个问题的答案。

    在Java中,类变量在以下位置初始化:

  • 超类的静态变量
  • 该类的所有静态变量都设置为它们的
  • 静态变量和静态初始化块,按声明顺序
  • 超类的实例变量
  • 该类的所有实例变量都设置为它们的值
  • 实例变量和实例级初始化块,按声明顺序
  • 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
    
    也就是说,
    ss2
    ss1
    会改变值


    原因是在中指定了这种行为。

    我想说,当所有字段都是独立的情况是一种特定情况,而不是相反。