栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【Java学习】关于Static的一些理解

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【Java学习】关于Static的一些理解

当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
--------------------
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/672992.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号