Java类变量的初始化
目录
两个必须的知识点
字节码指令验证
结果分析
非法前向引用变量
最近在学JVM,在学到类的初始化的时候明白了以前不是很理解的类中静态变量的初始化的过程,如果你也对静态变量的初始化有所困扰或者如下图的输出结果有所疑惑,相信你看完本文,一定会有所帮助。
两个必须的知识点
首先在讲解上图的内容的前,我们需要明白两个知识点。
在类加载过程中准备阶段,java虚拟机会给类变量赋予初始值,也就是0值。
所谓0值,也就是 0,null,false。int类型赋值为0,引用类型赋值为null,布尔类型赋值为false
类的初始化阶段是类加载过程中的最后一个步骤。
在前面的类初始化阶段中的准备(prepare)阶段中已经给类变量进行赋予初始值(0值),所以到了初始化阶段,会根据程序员通过程序编码指定的主观计划去初始化类变量和其他资源。
我们也可以从另外一种更直接的形式来表达:初始化阶段就是执行类构造器clinit()方法的过程。clinit()并不是程序员在Java代码中直接编写的方法,它是Javac编译器的自动生成物.
通俗来讲,到了初始化阶段,静态变量也就被赋予我们规定的值了。、
字节码指令验证
可以查看下图所示的例子,方便理解
我们可以通过jclasslib查看字节码指令
JVM中 int 类型数值,根据 取值范围将 入栈的 字节码指令 就分为4类:
取值 -1~5 采用 iconst
指令;
取值 -128~127 采用 bipush
指令;
取值 -32768~32767 采用 sipush
指令;
取值 -2147483648~2147483647 采用 ldc
指令。
不知道怎么查看字节码指令的朋友查看这里:
Idea中jclasslib的安装与使用_裴南苇_的博客-CSDN博客
结果分析
①由于在准备阶段,已经对类的静态变量赋予初始值,所以这里直接对x赋值不会报错(但是不能进行引用),这也就引出了下一个问题:非法前向引用变量。
②在初始化阶段,编译器收集的顺序是由语句在源文件中出现的顺序决定的。我们知道这一点之后,静态块中x被赋值20是先出现的,所以对应右面的jclasslib先赋值20,然后再被10覆盖,所以打印为10.
非法前向引用变量
虚拟机规定:静态语句块中只能访问到定义在静态语句块之前的变量,定义在它之后的变量,在前面的静态语句块可以赋值,但是不能访问。
所以下图的例子会编译失败。这也就是非法前向引用变量
好了,这次的文章就到这里,喜欢的同学可以点赞收藏,遇到问题,可以评论,或者留言,我一定会第一时间给到回馈,感谢观看!!
注:本文为本人学习时心得分享,有讲错或者需要改正的地方,请指正,我会虚心接受
Java类变量的初始化相关推荐
- java类变量什么时候初始化_Java类变量的初始化时机
先上代码 测试类public class MyNumber { public static MyNumber myNumber=new MyNumber(2.8); private static do ...
- java 实例变量初始化_java学习之实例变量初始化
实例变量的初始化方法 第一种:通过构造函数进行初始化. 第二种:通过声明实例字段初始化. 第三种:通过对象代码块初始化. 通过构造函数进行初始化方法 通过构造函数进行对象初始化,必须在类中声明一个带参 ...
- java有几种变量_java有多少种变量?java类变量怎么使用?
相信有很多刚入行学习java技术的人,对java有多少种变量都不是很清楚,清楚的了解java变量java人员才可以写出好代码,那么java有多少种变量?今天我们就来讲解一下. 成员变量:就是声明为类的 ...
- 浅谈 JAVA中静态初始化块和非静态初始化块的区别
众所周知在JAVA编程语言中有两种初始化块: 静态初始化块 非静态初始化块 他们到底有什么区别呢?今天就浅谈一下JAVA中静态初始化块和非静态初始化块的区别 静态初始化块 定义: static{} 执 ...
- Java实例变量初始化
原文地址:https://blog.csdn.net/cauchyweierstrass/article/details/48943077 题目是这样的:求下面程序的输出: public class ...
- 零基础Java学习之初始化块
初始化块 初始化块是类的五大成员之一,其包括类初始化块和实例初始化块 类初始化块 静态代码块 语法格式: [修饰符] class 类名{static{静态代码块语句;} } 位置:在类中方法外,一个类 ...
- java new 删除吗,java泛型对象初始化-java泛型对象会实例化吗T t=new T()
java泛型对象初始化--java泛型对象能实例化吗T t=new T() java中没法得到泛型参数化类型,因为在编译期没法确定泛型参数化类型,也就找不到对应的类字节码文件,自然就不行了 泛型反射的 ...
- java创建对象 的初始化顺序
java创建对象 的初始化顺序 1.初始化块 初始化块通常写在类的构造方法之前,由花括号括起来,通常包含对成员属性进行初始化的语句: 初始化块分为instance初始化块和static初始化块,初始化 ...
- java类成员初始化_简单了解Java类成员初始化顺序
这篇文章主要介绍了简单了解Java类成员初始化顺序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 类中包含7中成员: 1.静态变量 static 2 ...
最新文章
- 常考数据结构和算法:设计LRU缓存结构
- FFMPEG音视频同步-音视频实时采集并编码推流-优化版本
- 成功解决ValueError: setting an array element with a sequence.
- 转-iOS开发系列--地图与定位
- leetcode 42 接雨水 单调栈
- 【转】1.C Task.CompletedTask和Task.Result小记
- AMQP 和 RabbitMQ 入门
- 英文标点符号翻译大全
- iphone开热点电脑总是搜不到问题的解决办法(百试百灵)
- 五笔字根表识别码图_五笔输入法口诀(五笔字根表快速记忆图)
- 赛思永盛120G固体硬盘拆解,YS9082HC主控方案,布局很像公版2258XT和2259XT
- centos下smartctl安装配置(硬盘S.M.A.R.T信息及坏块检测命令)
- 张钹院士:清华大学AI研究院要孵化人工智能界的BAT
- 支付宝小程序分享转发
- 蓝牙基带数据传输机理分析
- MySQL TRUNCATE
- TiDB 帮助万达网络科技集团实现高性能高质量的实时风控平台
- REST协议解密(原创)
- 计算机游戏与动画技术课程,计算机游戏动画教学大纲.pdf
- 大道至简(读后感)第二章 是懒人造就了方法
热门文章
- Bloodhound 简介
- Bloodhound:成功人士的会议/活动管理工具
- 网上订火车卧铺票的经历
- 安装包UI美化之路-nsNiuniuSkin安装包模板介绍
- 某地公安局网警CTF比赛逆向路由固件
- 解决python问题:HTTPSConnectionPool(host=‘finance.yahoo.com‘, port=443): Read timed out. (read timeout=30
- 【BAT面试题典】子类可以继承到父类上的注解吗?
- jenkins整合gitee自动部署SpringBoot项目
- vbnet 产生 uniqueidentifier类型数据
- html多行文本框加滚动条,textbox多行带滚动条