JAVA,公共静态变量初始化

时间:2013-03-08 21:48:35

标签: java static initialization

/* ---------------------- classes --------------- */

public class A {
  public static String str = "compile";
      public A() {
  }
}

public class B {
  public static String str = A.str;

  public B() {
  }
}

/* ----------------------------------------------- */

/* ------------ main class --------------------- */

public class C {

  public static void main(String[] args) {
    A.str = "runtime";
    A a = new A();
    B b = new B();

    // comment at the first, and comment this out next time
    //A.str = "runtime2";

    System.out.println(A.str);
    System.out.println(a.str);
    System.out.println(B.str);
    System.out.println(b.str);
  }
}

/* --------------------------------------------- */

结果是这样的......

  1. 评论: 运行 运行 运行 运行

  2. 没有评论: runtime2 runtime2 运行 运行

  3. 我理解A的情况, 但我没有B的情况。 你能解释一下吗?

2 个答案:

答案 0 :(得分:2)

在代码中第一次出现A时,A.str被初始化为“compile”,但随后会被“runtime”覆盖。

然后您声明ab个实例。但这是第一次引用类B的地方,所以它被初始化 here A.str,这是当前的“运行时”。

在评论代码中

//A.str = "runtime2";

这只会改变A.str; B.str仍将引用“运行时”。并且可以使用类名A.str或实例a.str访问静态变量。

答案 1 :(得分:1)

java中的类是loaded and initialized when,它们是第一次被访问。

所以这里主要方法会发生什么:

  1. 你写A.str = ...:此时(在分配发生之前)加载并初始化类A,变量str保存字符串"compile"
  2. A.str = "runtime";之后,旧值"compile"被覆盖
  3. A a = new A();不会改变任何内容
  4. B b = new B();B也会加载并初始化。 B.str的值获取A.str
  5. 的实际值

    这就解释了第一个输出:runtime一路

    现在您取消了A.str = "runtime2";,只更改了类str中的变量AB.str保留runtime

    这就解释了第二个输出。