java调用类中的静态变量时类中静态代码块什么情况会执行以及类的初始化问题?

类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载、验证、准备、解析、初始化、使用和卸载七个阶段。
类初始化是类加载过程的最后一个阶段,到初始化阶段,才真正开始执行类中的Java程序代码。虚拟机规范严格规定了有且只有5种情况必须立即对类进行初始化:

第一种:遇到new、getstatic、putstatic、invokestatic这四条字节码指令时,如果类还没有进行过初始化,则需要先触发其初始化。生成这四条指令最常见的Java代码场景是:使用new关键字实例化对象时、读取或设置一个类的静态字段(static)时(被static修饰又被final修饰的,已在编译期把结果放入常量池的静态字段除外)、以及调用一个类的静态方法时。
第二种:使用Java.lang.refect包的方法对类进行反射调用时,如果类还没有进行过初始化,则需要先触发其初始化。
第三种:当初始化一个类的时候,如果发现其父类还没有进行初始化,则需要先触发其父类的初始化。
第四种:当虚拟机启动时,用户需要指定一个要执行的主类,虚拟机会先执行该主类。
第五种:当使用JDK1.5支持时,如果一个java.langl.incoke.MethodHandle实例最后的解析结果REF_getStatic、REF_putStatic、REF_invokeStatic的方法句柄,并且这个方法句柄所对应的类没有进行过初始化,则需要先触发其初始

执行代码:

package com.spring.partise;import java.util.Random;class A{static final int numA = Main.rand.nextInt(100);static{System.out.println("I am A");}
}
class B{static final int numB = 2;static{System.out.println("I am B");}
}
class C{static int numC = 3;static{System.out.println("I am C");}
}
public class Main {static Random rand = new Random();public static void main(String[] args) throws Exception {System.out.println("---------------------------");System.out.println(A.numA);//会执行static中的方法System.out.println("---------------------------");System.out.println(B.numB);//不会执行static中的方法System.out.println("---------------------------");System.out.println(C.numC);}
}

执行结果:

---------------------------
I am A
22
---------------------------
2
---------------------------
I am C
3

总结:如果一个static final值是“编译期常量”,就像static final int numB = 2;那样,那么这个值不需要对B类进行初始化就可以读取。但是,如果只是将一个域设置为static和final的,那不一足以确保这种行为,例如,对static final int numA = Main.rand.nextInt(100);的访问将强制进行类的初始化,因为它不是一个编译期常量。
如果一个static 域不是final,那么在对它访问时,总是要求在它被读取之前,要先进行链接(为这个域分配存储空间)和初始化(初始化该存储空间)就像static int numC = 3;那样!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/509341.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows驱动程序的加载

NT式驱动程序的加载 1. 用DriverMonitor工具加载NT式驱动 2. 在注册表中填写相应的字段,Windows对NT式驱动程序的加载,是基于服务的方式加载的,类似于Windows服务程序的加载。设备驱动程序的动态加载主要是基于服务控制程序(Service Contro…

北京市(朝阳区)(西城区)(海定区)正则表达式(代码保存)

“ String str “北京市(朝阳区)(西城区)(海定区)”; String ptr “.*?(?\()”; Pattern p Pattern.compile(ptr); Matcher matcher p.matcher(str); if(matcher.find()){ System.out.println(matcher.group()); } “

上升子序列

SubmitStatisticProblem Description 一个只包含非负整数的序列bi&#xff0c;当b1 < b2 < ... < bS的时候&#xff0c;我们称这个序列是上升的。对于给定的一个序列{a1, a2, ...,aN}&#xff0c;我们可以得到一些上升的子序列{ai1, ai2, ..., aiK}&#xff0c;这里1 …

设备对象

设备对象的结构体中有3个域 &#xff08;1&#xff09;DriverObject。这个比较好理解。就是这个设备对象所属的驱动对象。毕竟设备对象是由驱动对象创建的。 &#xff08;2&#xff09;NextDevice。指向下一个设备对象。这里的指向&#xff1a;指的是由同一个驱动对象的创建的设…

Resources.getResourceAsStream用法

Resources&#xff08;com.ibatis.common.resource.*&#xff09; Resources 类为从类路径中加载资源&#xff0c;提供了易于使用的方法。处理 ClassLoader 是一项 富于挑战的工作&#xff0c;尤其是应用服务器/容器的情况下。 Resources 类试图简化这些工作&#xff0c;Res…

阿里面试回来,想和Java程序员谈一谈

版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 目录(?)[-] 引言第一个问题阿里面试都问什么社招面试如何准备对于Java程序猿学习的建议结语 引言 其实本来真的没打算写这篇文章&#xff0c;主要是LZ得记忆力不是很好&#xff0c;不像一些记忆力强…

jquery添加div实现消息聊天框

上代码 <% page language"java" contentType"text/html; charsetUTF-8"pageEncoding"UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> &l…

数据结构实验之链表一:顺序建立链表

Problem Description 输入N个整数&#xff0c;按照输入的顺序建立单链表存储&#xff0c;并遍历所建立的单链表&#xff0c;输出这些数据。Input 第一行输入整数的个数N&#xff1b; 第二行依次输入每个整数。Output 输出这组整数。Example Input 8 12 56 4 6 55 15 33 62 Exam…

VS调试启动编辑并继续功能

在VS调试的过程中&#xff0c;可能需要进行源代码的修改&#xff0c;一般的做法是先停止当前的调试&#xff0c;然后重新编译再进行调试&#xff0c;哪怕做的一点点小的改动&#xff0c;这样做很浪费时间&#xff0c;尤其是当项目比较大&#xff0c;程序的启动和初始化需要较长…

IRP和IO_STACK_LOCATION

当一个应用程序调用函数去操作某个设备时&#xff0c;比如调用createFile,deviceIOControl,等等时&#xff0c;I/O管理器为此函数创建一个IRP数据结构对象和一个IRP_STACK_LOCATION数据结构对象数组。 &#xff08;数组个数等于驱动程序堆栈上驱动的个数&#xff09;。IRP对象中…

IRQL

转自&#xff1a;http://blog.csdn.net/changsha2011/article/details/6895529 最近开始入门windows 驱动开发&#xff0c;遇到一个IRQL。不知道何解&#xff0c;于是找了些资料&#xff0c;顺带记录下。下面的东西可能有不准确&#xff0c;如发现错误之处请指正&#xff0c;以…

#pragma code_seg(INIT)/code_seg(PAGE)

转自&#xff1a;http://blog.chinaunix.net/uid-24504987-id-161192.html Windows规定有些虚拟内存可以交换到文件中&#xff0c;这类内存被称为分页内存 有些虚拟内存 永远不会交换到文件中&#xff0c;这些内存叫非分页内存 #define PAGEDCODE code_seg(“PAGE”);//分页内…

JSON.stringify() 方法

JSON.stringify() 方法是将一个JavaScript值(对象或者数组)转换为一个 JSON字符串&#xff0c;如果指定了replacer是一个函数&#xff0c;则可以替换值&#xff0c;或者如果指定了replacer是一个数组&#xff0c;可选的仅包括指定的属性。 语法 JSON.stringify(value[, repla…

师--链表的结点插入

Problem Description 给出一个只有头指针的链表和 n 次操作&#xff0c;每次操作为在链表的第 m 个元素后面插入一个新元素x。若m 大于链表的元素总数则将x放在链表的最后。Input 多组输入。每组数据首先输入一个整数n(n∈[1,100])&#xff0c;代表有n次操作。接下来的n行&…

BeanUtils工具的使用(转载)

原文章地址&#xff1a;https://www.cnblogs.com/vmax-tam/p/4159985.html BeanUtils工具 什么是BeanUtils工具 BeanUtils工具是一种方便我们对JavaBean进行操作的工具&#xff0c;是Apache组织下的产品。 BeanUtils工具一般可以方便javaBean的哪些操作&#xff1f; 1&…

线程可警告状态以及APC队列

转自&#xff1a;http://blog.csdn.net/qq_22423659/article/details/53425828 一、线程可警告状态的真实含义 1、通过另一些方法让线程"暂停"(非SuspendThread方法&#xff0c;比如SleepEx&#xff0c;wait函数族等)&#xff0c;并可以进入一种称之为 Alterable的状…

数据结构实验之链表三:链表的逆置

Problem Description 输入多个整数&#xff0c;以-1作为结束标志&#xff0c;顺序建立一个带头结点的单链表&#xff0c;之后对该单链表的数据进行逆置&#xff0c;并输出逆置后的单链表数据。Input 输入多个整数&#xff0c;以-1作为结束标志。Output 输出逆置后的单链表数据。…

DBUtils使用详细示例(转载)

https://www.cnblogs.com/smyhvae/p/4085684.html

APC异步过程调用

转自&#xff1a;http://blog.sina.com.cn/s/blog_c2ef450f010192hx.html APC 异步过程调用 记得第一次看见这个名词的时候&#xff0c;觉得云里雾罩&#xff0c;然而上网看了下它的介绍&#xff0c;感觉说的都是没头没脑的 然而今天&#xff0c;我再次接触了它&#xff0c;我将…

张小龙:如何把产品做简单

今天从一个小故事开始讲&#xff1a;为什么苹果的手机只有一个按钮&#xff1f; &#xff08;台下&#xff1a;我觉得对于用户来说&#xff0c;只有一个按钮不会有太多的干扰&#xff0c;只要从这里开始&#xff0c;其它的菜单都在这里面了&#xff0c;这是我个人的一些想法。&…