静态变量是在什么时候被加载的?是编译器还是在运行期?
yuyutoo 2025-01-05 00:10 1 浏览 0 评论
静态变量的加载过程一般情况下是发生在在程序运行时的初始化阶段。具体来讲是在程序运行的时候,当类被第一次被加载到内存中的时候。这也就是是说,一个静态变量的生命周期是从类第一次被加载到内存时开始,直到程序结束时才被释放。
为什么在运行期加载,而不是在编译器加载?
静态变量在运行期加载,而不是在编译期加载的。其主要的原因就是编译期和运行期在作用和职责上的不同。
编译器会在程序代码被编译的时候将静态变量的信息,例如类型、名称等信息,记录在生成的类文件中,也就是class的字节码文件中。而静态变量的具体值的加载不会在编译期完成,这是因为编译器并不负责对静态变量进行初始化,只是将其定义的结构保存在字节码中。
我们知道Java中的类加载机制是延迟加载(Lazy Loading)的,也就是说,类只有在被第一次使用时,才会加载到内存中。
而通过静态变量的定义我们也知道,静态变量是与类绑定到一起的,所以静态变量的初始化也是在类被加载到内存时进行的。编译器无法预测类何时、在何种环境下会被使用,因此不能在编译期为其分配内存或初始化静态变量。
也就是说,我们的程序第一次使用这个类时,我们其访问静态变量或调用静态方法,这个时候类就会被类加载器加载到内存中。而我们定义的静态变量会被分配内存并进行初始化操作。具体顺序如下:
- 类的静态代码块(如果有)会首先执行。
- 静态变量会按照定义的顺序进行初始化(如果有初始化表达式)。
所以根据上面的解释,我们知道了,静态变量的加载和初始化是在运行期,而且是在类第一次被加载到内存时发生的。
代码示例
为了说明静态变量的加载机制及其初始化顺序,我们将通过一个简单的Java示例代码来解释静态变量的加载时机、初始化顺序以及它与静态代码块的关系,如下所示。
class Demo {
// 静态变量
static int staticVar = getStaticVar();
// 静态代码块
static {
System.out.println("Static block is executed.");
}
// 非静态变量
int nonStaticVar = getNonStaticVar();
// 静态方法用于初始化静态变量
static int getStaticVar() {
System.out.println("Static variable is initialized.");
return 100;
}
// 非静态方法用于初始化非静态变量
int getNonStaticVar() {
System.out.println("Non-static variable is initialized.");
return 200;
}
// 构造函数
Demo() {
System.out.println("Constructor is executed.");
}
// 主方法
public static void main(String[] args) {
System.out.println("Main method is executed.");
// 第一次创建对象
Demo demo1 = new Demo();
// 第二次创建对象
Demo demo2 = new Demo();
}
}
输出结果如下所示。
Static variable is initialized.
Static block is executed.
Main method is executed.
Non-static variable is initialized.
Constructor is executed.
Non-static variable is initialized.
Constructor is executed.
在Demo类第一次加载时,静态变量staticVar被初始化。这个时候,就会看到Static variable is initialized.的输出结果,这就说明了,静态变量的初始化是类加载时(运行期)完成的,而不是在编译期完成。
而在静态变量被初始化之后,我们执行了静态代码块,这个时候就会输出 "Static block is executed."。这也就说明,静态代码块是在类加载时执行的,作用是用来在类加载期间完成一些初始化工作。
类加载完成后,main() 方法开始执行,输出"Main method is executed."。当Demo类的实例demo1被创建时,非静态变量nonStaticVar被初始化,接着调用构造函数。在demo1的初始化过程中,输出了"Non-static variable is initialized." 和"Constructor is executed."。
多次创建实例的时候,我们会发现,非静态变量和构造函数都会重新执行,但静态变量和静态代码块不会再次执行,因为静态变量和静态代码块只在类第一次加载时执行一次。
总结
静态变量的加载和初始化是在运行期,并且是类在第一次被加载到内存时发生的。通过在运行期加载静态变量,Java 能够在运行时根据实际需要进行类的加载和初始化,支持动态链接和模块化程序设计。这保证了程序的灵活性、可移植性和高效的资源使用。
相关推荐
- 使用 Node.js、Canvas 和 FFmpeg 实时生成并推送视频流
-
1、背景和需求在许多实时视频应用场景中,我们需要动态生成实时视频流并将其推送到RTMP服务器。例如,我们可能需要生成一个实时显示当前时间的视频流,或者在游戏直播时显示实时弹幕等。本文将介绍如何使...
- 熊孩子高空泼墨,全楼都遭殃!父母的反应让全网点赞
-
自家熊孩子从楼上泼墨邻居晾的衣服、楼的外墙…无一幸免!事发后孩子父母的反应让全网点赞!5月21日,江苏宿迁。网友“宇兄宇弟”发了几条短视频,只见视频中阳台上晾晒的衣服全都被泼上了墨汁,楼下地上和楼外墙...
- 动态爬虫(ajax)-爬取bilibili热门视频信息
-
前言使用python爬虫爬取bilibli每日热门视频的数据使用的第三方软件包括requests、my_fake_useragent...
- 轻视频课程:AngularJS开发框架实用编程入门之一
-
这个基础课程将介绍知名的Google前端开发框架AngularJS的基础使用,包括:基本概述,数据绑定,指令,表达式,控制器,过滤器等基础内容课程内容:AngularJS核心功能数据绑定:自动同步视图...
- html5的video标签实现对m3u8格式视频(HLS)的支持 亲测可用
-
在切图网一个项目切图中遇到的,网页中嵌入视频理所当然用html5自带的video标签即可实现,也有比较主流的插件videojs,但是这个比较特别播放的视频是m3u8格式的(这种好像imacsaf...
- html5的video标签实现m3u8格式的支持,基于hls.min.js
-
切图网站的踩坑笔记,vue开发项目中通过api接口获取到了m3u8格式的音频,但是有的浏览器默认不支持,所以需要借助辅助手段来实现,下面介绍详细方法。什么是m3u8?m3u8是m3u的一种,是utf-...
- 基于 vue.js+xgplayer 开源音视频播放器组件
-
今天继续给小伙伴们分享一个西瓜视频播放器Vue组件XGPlayer-Vue。xgplayer-vue西瓜视频播放器xgplayer的vue.js版本组件。安装...
- 盘点戏精萌娃的搞笑日常,好看吗?
-
孩子们搞笑的日常。盘点戏精萌娃的搞笑日常。好看吗?你这不是难为我吗?这咋难为你了,你别怪我说话直,那你也别怪我下手重。我这一身傲骨还能不怕你威胁吗?就让你看这衣服好不好看,怎么这么费劲?衣服。...
- WEB页面页面播放实时视频流
-
业务述求需要在WEB端实时查看现场的视频监控(公司选型的是大华摄像机)1技术方案选型1.ffmpeg通过rtsp协议拉取视频流2.使用vlcmediaplayer组件拉取视频流,在...
- 科研笔记神器:??一边视频,一边笔记,轻松搞定B站视频学习
-
上一期,笔者介绍了一款笔记神器——Obsidian,它可以用于思维导图和知识管理。...
- 在网页上显示监控视频
-
最近需要在web项目中显示监控视频,采用了webrtc+webrtc-streamer+coturn的方案实现,能够在公网上做很低的延时,对于实时监控视频有很好的效果,是目前来讲比较好的一个选择方案...
- Node.js服务端使用ffmpeg压缩视频处理技巧
-
在Node.js中,我们可以使用fluent-ffmpeg进行视频的合并、拼接、修改、转码、压缩等操作。网上的资料有很多,但是大部分是英文的,对于普通开发者来说,要轻松地了解使用方法还是很有难度的。...
- 杜淳晒女儿跑步萌态,1岁小蛋饺步伐超稳,全身肉嘟嘟可爱爆棚
-
4月27日下午,杜淳在个人社交平台分享了一段女儿小蛋饺跑步的萌态,老父亲还感慨写道:“奔跑吧,我的小蛋饺,跑着跑着就长大了,我的小公主”。杜淳自从升级奶爸后,这“女儿奴”属性真是愈发明显了,每一次晒与...
- 8款测试HLS m3u8视频流的免费在线播放器
-
翻译:Alex技术审校:纪永康本文来自OTTVerse,作者为KrishnaRaoVijayanagar。...
- HLS视频拉流播放
-
1、安装HlsVue.js是一个适用于构建用户界面的渐进型框架,它的流行程度已经在现代Web应用开发领域中得到了广泛的认可。而HLS(HTTPLiveStreaming)则是一种广泛应用于视频流媒...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- mybatis plus (70)
- scheduledtask (71)
- css滚动条 (60)
- java学生成绩管理系统 (59)
- 结构体数组 (69)
- databasemetadata (64)
- javastatic (68)
- jsp实用教程 (53)
- fontawesome (57)
- widget开发 (57)
- vb net教程 (62)
- hibernate 教程 (63)
- case语句 (57)
- svn连接 (74)
- directoryindex (69)
- session timeout (58)
- textbox换行 (67)
- extension_dir (64)
- linearlayout (58)
- vba高级教程 (75)
- iframe用法 (58)
- sqlparameter (59)
- trim函数 (59)
- flex布局 (63)
- contextloaderlistener (56)