1
/* ---------------------- 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 runtime 运行时

我理解 A 的情况,但我不理解 B 的情况。你能解释一下吗?

4

2 回答 2

2

A在您的代码中第一次出现时,A.str被初始化为“编译”,但随后它立即被“运行时”覆盖。

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

在您注释的代码中,

//A.str = "runtime2";

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

于 2013-03-08T22:00:44.560 回答
1

java中的类在第一次被访问时被加载和初始化。

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

  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

这就是解释第一个输出runtime的原因:一路

现在您取消注释 ,仅更改了类中A.str = "runtime2";的变量。保持在。strAB.strruntime

这就是解释第二个输出的原因。

于 2013-03-08T22:08:42.530 回答