/* ---------------------- 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);
}
}
/* --------------------------------------------- */
结果是这样的......
评论: 运行 运行 运行 运行
没有评论: runtime2 runtime2 运行 运行
我理解A的情况, 但我没有B的情况。 你能解释一下吗?
答案 0 :(得分:2)
在代码中第一次出现A
时,A.str
被初始化为“compile”,但随后会被“runtime”覆盖。
然后您声明a
和b
个实例。但这是第一次引用类B
的地方,所以它被初始化 here 到A.str
,这是当前的“运行时”。
在评论代码中
//A.str = "runtime2";
这只会改变A.str
; B.str
仍将引用“运行时”。并且可以使用类名A.str
或实例a.str
访问静态变量。
答案 1 :(得分:1)
java中的类是loaded and initialized when,它们是第一次被访问。
所以这里主要方法会发生什么:
A.str = ...
:此时(在分配发生之前)加载并初始化类A
,变量str
保存字符串"compile"
A.str = "runtime";
之后,旧值"compile"
被覆盖A a = new A();
不会改变任何内容B b = new B();
类B
也会加载并初始化。 B.str
的值获取A.str
这就解释了第一个输出:runtime
一路
现在您取消了A.str = "runtime2";
,只更改了类str
中的变量A
。 B.str
保留runtime
。
这就解释了第二个输出。