IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 【Java学习】关于Static的一些理解 -> 正文阅读

[Java知识库]【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
--------------------
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-12-18 15:50:19  更:2021-12-18 15:52:38 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 6:05:45-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码