Java类加载的时机
类是什么时候初始化的?类初始化的时候会执行static块,这个是我们知道的。那么我们可以用static块来做个实验。
上面代码输出是:
hello world
init
this is a test
这说明了什么?在调用TR.hello_world的时候,类并没有初始化!而是在调用其方法test的时候才初始化的。
这是因为在编译的时候,常量(static final 修饰的)会存入调用类的常量池【这里说的是main函数所在的类的常量池】,调用的时候本质上没有引用到定义常量的类,而是直接访问了自己的常量池。所以,这里调用TR.hello_world的时候,TR并没有初始化。
类初始化的时机,有且仅有四个:
1、遇到new、getstatic、putstatic、invokestatic这四条字节码指令的时候。
2、使用java.lang.reflect进行反射调用的时候。
3、当初始化一个类的时候,发现其父类还没有初始化,那么先去初始化它的父类。
4、当虚拟机启动的时候,需要初始化main函数所在的类。
说到这里,还要说下,静态变量和静态初始化块,普通变量、普通初始化块之间的初始化顺序。
对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序依次是
(静态变量、静态初始化块)>
(变量、初始化块)>
 构造器
http://www.cnblogs.com/jackyrong/archive/2008/08/12/1266161.html
链接中说明了,静态变量和静态初始化块的声明顺序决定了初始化的顺序。
静态变量和静态初始化块的初始化时间::早于::普通变量和普通初始化块::早于::构造方法。
并不是完全父类初始化完毕之后,子类才开始初始化。实际上子类的静态变量和静态初始化块的初始化是在父类的变量、初始化块和构造器初始化之前就完成了。

上面报错的地方,有点奇怪。
明明在上面都赋值b=2了的。怎么打印语句就不行呢。
这是因为在类初始化的时候,就规定了,静态语句块中只能访问到定义在静态语句块之前的变量,定义在它之后的,只能赋值,不能访问。
http://blog.csdn.net/imzoer/article/details/8038249
Java类加载的时机的更多相关文章
- Java类加载的时机_4种主动引用会触犯类加载+剩下的被动引用不会触发类的加载
		
转载自:http://chenzhou123520.iteye.com/blog/1597597 Java虚拟机规范没有强制性约束在什么时候开始类加载过程,但是对于初始化阶段,虚拟机规范则严格规定了有 ...
 - 深入理解java虚拟机(七)类加载的时机
		
Class 文件中描述的各种信息都必须加载到虚拟机中才能运行和使用.而虚拟机怎么加载这些Class 文件呢?Class 文件进入到虚拟机中会发生什么变化呢? 虚拟机类加载机制是指 虚拟机把描述类的数据 ...
 - java类加载及类初始化
		
1.前言 java是跨平台语言,主要是因为它的java虚拟机的存在,java有事编译语言,所以需要将编写的java文件编译成jvm可运用的class字节码文件.在java中一切皆对象.对于Java虚拟 ...
 - Java 类加载机制(阿里面试题)-何时初始化类
		
(1)阿里的面试官问我,可以不可以自己写个String类 答案:不可以,因为 根据类加载的双亲委派机制,会去加载父类,父类发现冲突了String就不再加载了; (2)能否在加载类的时候,对类的字节码进 ...
 - 深入理解JVM(8)——类加载的时机
		
一.类的生命周期 一个类从加载进内存到卸载出内存一共要经历7个阶段:加载—>验证—>准备-->解析—>初始化—>使用—>卸载. 类加载包括五部分:加载—>验证 ...
 - 深入理解Java类加载
		
本文目的: 深入理解Java类加载机制; 理解各个类加载器特别是线程上下文加载器; Java虚拟机类加载机制 虚拟机把描述类的数据从 Class 文件加载到内存,并对数据进行校验.转换解析和初始化,最 ...
 - 一文读懂Java类加载机制
		
Java 类加载机制 Java 类加载机制详解. @pdai Java 类加载机制 类的生命周期 类的加载:查找并加载类的二进制数据 连接 验证:确保被加载的类的正确性 准备:为类的静态变量分配内存, ...
 - Java 类加载机制(阿里)-何时初始化类
		
(1)阿里的面试官问了两个问题,可以不可以自己写个String类 答案:不可以,因为 根据类加载的双亲委派机制,会去加载父类,父类发现冲突了String就不再加载了; (2)能否在加载类的时候,对类的 ...
 - Java类加载机制()
		
Java类加载机制(转载) 概述 在开始正文之前,我们先看两张图 .Java平台的理解?Java最显著的特性?Java是解释执行? 先看一下java程序的执行流程图 再看一下jvm的大致物理结构图 本 ...
 
随机推荐
- TCP 函数
			
[root@localhost tt]# man listen LISTEN() Linux Programmer’s Manual LISTEN() NAME listen - listen for ...
 - RPM命令用法详解
			
RPM 有五种基本的操作方式(不包括创建软件包): 安装, 卸载, 升级, 查询,和验证. 下面我们就来逐一的讲解吧. 一. 安装RPM包 RPM 软件包通常具有类似foo-1.0-1.i386.rp ...
 - FreeCodeCamp 的 Basic Algorithm Scripting 题解(1)
			
这是本人的原创文章,转载请注明原文链接http://www.cnblogs.com/wusuowiaaa1blog/p/5932121.html. 1.Reverse a String 翻转字符串 先 ...
 - codevs1024一塔湖图(丧心病狂的建图)
			
/* 丧心病狂的最短路 关键是建图 根据题目中给的路 拆出节点来 建图 (i,j) -->(j-1)*n+i 然后根据障碍 把死路 湖覆盖的dis改变成极大值 然后Floyd 然后 然后就没有然 ...
 - RSA签名验签
			
import android.util.Base64; import java.security.KeyFactory; import java.security.PrivateKey; import ...
 - Oracle利用dbms_metadata.get_ddl查看DDL语句
			
当我们想要查看某个表或者是表空间的DDL的时候,可以利用dbms_metadata.get_ddl这个包来查看. dbms_metadata包中的get_ddl函数详细参数 GET_DDL函数返回创建 ...
 - HashMap HashTable HashSet
			
原文转载自 http://blog.csdn.net/wl_ldy/article/details/5941770 HashMap是新框架中用来代替HashTable的类 也就是说建议使用HashMa ...
 - jQuery实现的向下推送图文信息滚动效果
			
HTML 我们以新浪微博信息滚动为背景,html中包含了多条微博图文信息,结构如下: <div id="con"> <ul> <li> < ...
 - 『重构--改善既有代码的设计』读书笔记----Move Field
			
在类与类之间搬移状态和行为,是重构过程中必不可少的步骤.很有可能在你现在觉得正常的类,等你到了下个礼拜你就会觉得不合适.或者你在下个礼拜创建了一个新的类并且你需要讲现在类的部分字段和行为移动到这个新类 ...
 - Grunt:多个css,js,进行单独压缩
			
module.exports = function (grunt) { // 构建任务配置 grunt.initConfig({ //读取package.json的内容,形成个json数据 pkg: ...