热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Java类变量的初始化

目录两个必须的知识点字节码指令验证结果分析非法前向引用变量最近在学JVM,在学到类的初始化的时候明白了以前不是很理解的类中静态变量的初始化的过程,

目录

两个必须的知识点

字节码指令验证

结果分析

非法前向引用变量



        最近在学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 架构:深入理解 JDK 动态代理机制
    代理模式是 Java 中常用的设计模式之一,其核心在于代理类与委托类共享相同的接口。代理类主要用于为委托类提供预处理、过滤、转发及后处理等功能,以增强或改变原有功能的行为。 ... [详细]
  • 本文详细探讨了Java中的ClassLoader类加载器的工作原理,包括其如何将class文件加载至JVM中,以及JVM启动时的动态加载策略。文章还介绍了JVM内置的三种类加载器及其工作方式,并解释了类加载器的继承关系和双亲委托机制。 ... [详细]
  • java文本编辑器,java文本编辑器设计思路
    java文本编辑器,java文本编辑器设计思路 ... [详细]
  • ElasticSearch 集群监控与优化
    本文详细介绍了如何有效地监控 ElasticSearch 集群,涵盖了关键性能指标、集群健康状况、统计信息以及内存和垃圾回收的监控方法。 ... [详细]
  • 深入解析 Android IPC 中的 Messenger 机制
    本文详细介绍了 Android 中基于消息传递的进程间通信(IPC)机制——Messenger。通过实例和源码分析,帮助开发者更好地理解和使用这一高效的通信工具。 ... [详细]
  • 2017-2018年度《网络编程与安全》第五次实验报告
    本报告详细记录了2017-2018学年《网络编程与安全》课程第五次实验的具体内容、实验过程、遇到的问题及解决方案。 ... [详细]
  • 本文详细介绍了Java中的注解功能,包括如何定义注解类型、设置注解的应用范围及生命周期,并通过具体示例展示了如何利用反射机制访问注解信息。 ... [详细]
  • 俗话说得好,“工欲善其事,必先利其器”。这句话不仅强调了工具的重要性,也提醒我们在任何项目开始前,准备合适的工具至关重要。本文将介绍几款C语言编程中常用的工具,帮助初学者更好地选择适合自己学习和工作的编程环境。 ... [详细]
  • 本文探讨了2019年前端技术的发展趋势,包括工具化、配置化和泛前端化等方面,并提供了详细的学习路线和职业规划建议。 ... [详细]
  • 本文探讨了使用Java创建高效且可靠的基准测试的方法,强调了选择合适的工具和理解潜在影响因素的重要性。 ... [详细]
  • 大数据基础:JavaSE_day06 ... [详细]
  • MapReduce原理是怎么剖析的
    这期内容当中小编将会给大家带来有关MapReduce原理是怎么剖析的,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1 ... [详细]
  • 单例模式是软件开发中常用的设计模式之一,用于确保一个类只有一个实例,并提供一个全局访问点。本文探讨了在单例模式实现中使用volatile关键字的重要性,特别是在懒汉模式下的应用。 ... [详细]
  • 本文总结了WebSphere应用服务器出现宕机问题的解决方法,重点讨论了关键参数的调整,包括数据源连接池、线程池设置以及JVM堆大小等,旨在提升系统的稳定性和性能。 ... [详细]
  • 收割机|篇幅_国内最牛逼的笔记,不接受反驳!!
    收割机|篇幅_国内最牛逼的笔记,不接受反驳!! ... [详细]
author-avatar
mobiledu2502876223
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有