当static修饰变量或者方法时,被称为类变量或者类方法,在类被加载的时候,跟着类一起加载。
class StaticTest {
static String MY_STATIC_STRING = "结果: " + getMyBoolean();
static boolean getMyBoolean() {
boolean isRandom = new Random().nextBoolean();
System.out.println("isRandom: " + isRandom);
return isRandom;
}
}
在类中定义一个静态变量MY_STATIC_STRING
一个静态方法getMyBoolean()
其中,静态变量的值有一部分是从静态方法中获取
再定义一个测试类
public class StaTest {
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
System.out.println("getMyBoolean: " + StaticTest.getMyBoolean());
System.out.println(StaticTest.MY_STATIC_STRING);
System.out.println("--------------------");
}
}
}
通过一个循环,进行多次调用类中的getMyString()静态方法和MY_STATIC_STRING静态变量
运行结果如下
isRandom: true isRandom: false getMyBoolean: false 结果: true -------------------- isRandom: false getMyBoolean: false 结果: true -------------------- isRandom: true getMyBoolean: true 结果: true -------------------- isRandom: false getMyBoolean: false 结果: true -------------------- isRandom: false getMyBoolean: false 结果: true -------------------- isRandom: true getMyBoolean: true 结果: true -------------------- isRandom: true getMyBoolean: true 结果: true -------------------- isRandom: true getMyBoolean: true 结果: true -------------------- isRandom: true getMyBoolean: true 结果: true -------------------- isRandom: true getMyBoolean: true 结果: true --------------------
分析
从结果中可以看出,第一次运行的时候,类StaticTest进行加载了一次,然后就没有再次加载,所以看起来第一次的运行结果上面有着两次isRandom的提示
因为在类加载过程中,加载静态方法getMyBoolean()获得一个返回值为true,然后赋给静态变量MY_STATIC_STRING,在类加载完成之后,静态变量被加载到了方法区
方法区存储的东西
1.存储代码片段
当一个类进行编译时产生了一个字节码文件通过类加载器加载到jvm的内存中,这时便会在方法区产生类的字节码文件。
2.存储静态的成员变量(也叫做类变量)。
在静态变量被加载之后,此时MY_STATIC_STRING="结果: " + getMyBoolean()被保存在方法区,此时的 getMyBoolean()返回的为true,所以在方法区的MY_STATIC_STRING=结果: true
但是getMyBoolean()每次运行的时候结果都会变化,而静态变量MY_STATIC_STRING又调用了这个静态方法,那么是不是代表每次调用MY_STATIC_STRING都会获得最新的getMyBoolean()返回值呢?
答案通过运行结果可以看出来,在MY_STATIC_STRING被加载之后,它的值就不变了,而且在每次调用MY_STATIC_STRING时,也不会调用getMyBoolean()方法,所以即使getMyBoolean()返回的结果有变化,MY_STATIC_STRING也不会获取到最新的变化。无论调用多少次,MY_STATIC_STRING的值一直是在类加载时获得的值。
那要是需要获取最新的改变的值应该怎么写呢?
//改进如下
public static String getMyStaticString() {
return "结果: " + getMyBoolean();
}
改变之后的完整代码
class StaticTest {
static String MY_STATIC_STRING = "结果: " + getMyBoolean();
static boolean getMyBoolean() {
boolean isRandom = new Random().nextBoolean();
System.out.println("isRandom: " + isRandom);
return isRandom;
}
//改进如下
public static String getMyStaticString() {
return "结果: " + getMyBoolean();
}
}
public class StaTest {
public static void main(String[] args) {
System.out.println(StaticTest.MY_STATIC_STRING);
System.out.println("======================");
for (int i = 0; i < 10; i++) {
System.out.println("getMyBoolean: " + StaticTest.getMyBoolean());
System.out.println(StaticTest.getMyStaticString());
System.out.println("--------------------");
}
}
}
运行结果
isRandom: true 结果: true ====================== isRandom: true getMyBoolean: true isRandom: false 结果: false -------------------- isRandom: false getMyBoolean: false isRandom: true 结果: true -------------------- isRandom: false getMyBoolean: false isRandom: true 结果: true -------------------- isRandom: false getMyBoolean: false isRandom: false 结果: false -------------------- isRandom: true getMyBoolean: true isRandom: true 结果: true -------------------- isRandom: false getMyBoolean: false isRandom: false 结果: false -------------------- isRandom: false getMyBoolean: false isRandom: true 结果: true -------------------- isRandom: true getMyBoolean: true isRandom: false 结果: false -------------------- isRandom: false getMyBoolean: false isRandom: true 结果: true -------------------- isRandom: false getMyBoolean: false isRandom: true 结果: true --------------------



