java类加载机制的代码实例
package typeinfo; import java.util.Random; class Initable
{
static final int staticFinal = 47 ;
static final int staticFinal2 = RandomInit.rand.nextInt(1000) ; static
{
System.out.println("initializing initable");
}
} class Initable2
{
static int staticNonFinal = 147 ;
static
{
System.out.println("initializing initable2");
}
} class Initable3
{
static int staticNonFinal = 47 ;
static
{
System.out.println("initializing initable3");
}
} class RandomInit
{
public static Random rand = new Random(47) ;
static
{
System.out.println("hello");
}
} class Initable4
{
static{
System.out.println("initable 4");
}
static final double x = ClassInitialization.pi ;
} class Initable5
{
static{
System.out.println("initable 5");
}
} public class ClassInitialization
{
static final double pi = 3.1415 ;
public static void main(String[] args)throws Exception
{
System.out.println(Initable4.x); //由于x是编译时常量(常量表达式), 所以不会引起Initable4的初始化
System.out.println("----");
Class initable = Initable.class ; //不属于引起初始化的4种条件之一, 不会引起初始化
System.out.println("after creating initable ref") ; System.out.println(Initable.staticFinal);//staticFinal是编译时常量, 在解析时被替换成47, 不会引起初始化
System.out.println(Initable.staticFinal2);//staticFinal2不是编译时常量, 会引起初始化, 属于getstatic System.out.println(Initable2.staticNonFinal);//非常量, 引起初始化, 属于getstatic
Class initable3 = Class.forName("typeinfo.Initable3") ;//会引起初始化, 但是不知道为什么
System.out.println("after creating initable3 ref");
System.out.println(Initable3.staticNonFinal); Initable5[] initable5s = new Initable5[10] ;//不属于那4中条件之一, 不初始化
}
}
class SSClass
{
static
{
System.out.println("SSClass");
}
}
class SuperClass extends SSClass
{
static
{
System.out.println("SuperClass init!");
} public static int value = 123; public SuperClass()
{
System.out.println("init SuperClass");
}
}
class SubClass extends SuperClass
{
static
{
System.out.println("SubClass init");
} static int a; public SubClass()
{
System.out.println("init SubClass");
}
} public class NotInitation
{
public static void main(String[] args)
{
System.out.println(SubClass.value);//由于是子类引用父类静态成员, 不属于初始化的那四种, 因此不会使SubClass初始化
}
}
/**
* SSClass
* SuperClass init!
* 123
*/
public class StaticTest
{
public static void main(String[] args)
{
staticFunction();
} static StaticTest st = new StaticTest(); static
{
System.out.println("1");
} {
System.out.println("2");
} StaticTest()
{
System.out.println("3");
System.out.println("a="+a+",b="+b);
} public static void staticFunction(){
System.out.println("4");
} int a=110;
static int b =112;
}
/**
* 使用了invokestatic(staticFunction()),因此要对StaticTest进行加载并初始化
* 初始化时, 先加载,验证, 然后准备(在这个阶段, st被赋值为null,b为0, 然后解析(这个实例什么都没干)
* 最后执行初始化, 形成的cinit如下
* {
* st = new Statictest() ;
* System.out.println("1") ;
* b = 112 ;
* }
* 只要连接阶段(验证, 准备,解析)一过, 其实整个类就可以使用了, 在执行new StaticTest时, 先将成员变量初始化
* 为0或null, 也就是a=0 , 然后再按照非静态代码块和成员变量的初始化顺序,依次执行初始化, 也就是先执行
* {
* System.out.println("2");
* }
* 然后执行a=110 ;
* 最后执行 StaticTest()
* {
* System.out.println("3");
* System.out.println("a="+a+",b="+b);
* }
*
* 所以总体的执行输出结果为
* 2
* 3
* a=110,b=0
* 1
* 4
*/
//http://www.importnew.com/18548.html
//http://blog.csdn.net/java2000_wl/article/details/8040633
//thinking in java笔记
java类加载机制的代码实例的更多相关文章
- Java 类加载机制
类的加载: 类的初始化: 类什么时候才被初始化:1)创建类的实例,也就是new一个对象2)访问某个类或接口的静态变量,或者对该静态变量赋值3)调用类的静态方法4)反射(Class.forName(&q ...
- Java类加载机制深度分析
转自:http://my.oschina.net/xianggao/blog/70826 参考:http://www.ibm.com/developerworks/cn/java/j-lo-class ...
- 理解Java类加载机制(译文)
理解java类加载机制 你想写类加载器?或者你遇到了ClassCastException异常,或者你遇到了奇怪的LinkageError状态约束异常.应该仔细看看java类的加载处理了. 什么是类加载 ...
- 两道面试题,带你解析Java类加载机制
文章首发于[博客园-陈树义],点击跳转到原文<两道面试题,带你解析Java类加载机制> 在许多Java面试中,我们经常会看到关于Java类加载机制的考察,例如下面这道题: class Gr ...
- 【转】两道面试题,带你解析Java类加载机制(类初始化方法 和 对象初始化方法)
本文转自 https://www.cnblogs.com/chanshuyi/p/the_java_class_load_mechamism.html 关键语句 我们只知道有一个构造方法,但实际上Ja ...
- Java类加载机制及自定义加载器
转载:https://www.cnblogs.com/gdpuzxs/p/7044963.html Java类加载机制及自定义加载器 一:ClassLoader类加载器,主要的作用是将class文件加 ...
- Java类加载机制与Tomcat类加载器架构
Java类加载机制 类加载器 虚拟机设计团队把类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类.实现这 ...
- 带你解析Java类加载机制
目录 Java类加载机制的七个阶段 加载 验证 准备(重点) 解析 初始化(重点) 使用 卸载 实战分析 方法论 树义有话说 在许多Java面试中,我们经常会看到关于Java类加载机制的考察,例如 ...
- 深入理解和探究Java类加载机制
深入理解和探究Java类加载机制---- 1.java.lang.ClassLoader类介绍 java.lang.ClassLoader类的基本职责就是根据一个指定的类的名称,找到或者生成其对应的字 ...
随机推荐
- Java-在JVM关闭前调用的函数
参考:http://qtlkw.iteye.com/blog/1018872 package com.tj; import java.text.SimpleDateFormat; import jav ...
- 学习笔记3——WordPress文件目录结构详解
**********根目录********** 1.index.php:WordPress核心索引文件,即博客输出文件.2.license.txt:WordPress GPL许可证文件.3.my-ha ...
- HDU-5317 RGCDQ ,暴力打表!
RGCDQ 暴力水题,很可惜比赛时没有做出来,理清思路是很简单的. 题意:定义f(i)表示i的素因子个数,给你一段区间[l,r],求max_gcd(f(i),f(j)).具体细节参考题目. 思路:数据 ...
- POJ 1745 Divisibility
Divisibility Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 9476 Accepted: 3300 Desc ...
- (转)iOS字体
一.iOS原生字体展示 在 label中选择字体的font,并把font由system改成custom后,就能在family中看到72种特殊字体.这些里面就有很炫的字体,但 是全部是只针对英文数字,对 ...
- [BZOJ1419] Red is good(期望DP)
传送门 逆推 只不过顺序还是顺着的,思想是逆着的 f[i][j]表示还剩下i张红牌,j张黑牌的期望值 那么边界是 f[i][0]=i,因为只剩i张红牌 f[0][j]=0,只剩黑牌,显然直接停止最优 ...
- 刷题总结——动态逆序对(bzoj3295)
题目: Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素 ...
- P1754 球迷购票问题 (卡特兰数,递推)
题目背景 盛况空前的足球赛即将举行.球赛门票售票处排起了球迷购票长龙. 按售票处规定,每位购票者限购一张门票,且每张票售价为50元.在排成长龙的球迷中有N个人手持面值50元的钱币,另有N个人手持面值1 ...
- java面试题之什么是ThreadLocal?底层如何实现的?
ThreadLocal是一个解决线程并发问题的一个类,用于创建线程的本地变量,我们知道一个对象的所有线程会共享它的全局变量,所以这些变量不是线程安全的,我们可以使用同步技术.但是当我们不想使用同步的时 ...
- 军训分批(codevs 2751)
题目描述 Description 某学校即将开展军训.共有N个班级. 前M个优秀班级为了保持学习优势,必须和3位任课老师带的班级同一批. 问共有几批? 输入描述 Input Description N ...