当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
--------------------
|