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类的基本职责就是根据一个指定的类的名称,找到或者生成其对应的字 ...
随机推荐
- 【C#】C#数据类型和VB的区别
导读:看完了C#,需要总结的有很多东西.开始没有怎么在意,根本没有意识到,那些视频是教给了我一种新的编程语言,我就真的是像看电视剧一样的看完了.猛然想起了学过的VB,这是目前为止,我接触到的仅有的语言 ...
- HLG 2025
确定大小 Time Limit: 1000 MS Memory Limit: 32768 K Total Submit: 50(15 users) Total Accepted: 12(11 user ...
- 九度oj 题目1398:移动次数
题目描述: 众所周知JOBDU旗下的JOBBALA公司是一家以个性.亲民著称的IT公司.在JOBBALA公司成立50周年的日子里,公司CEO组织全体员工登山旅游.按照往常的习惯,导游通常要求游客按照身 ...
- app审核相关
app加急审核通道:https://developer.apple.com/contact/app-store/?topic=expedite
- 手写数字0-9的识别代码(SVM支持向量机)
帮一个贴吧的朋友改的一段代码,源代码来自<机器学习实战> 原代码的功能是识别0和9两个数字 经过改动之后可以识别0~9,并且将分类器的产生和测试部分分开来写,免得每次测试数据都要重新生成分 ...
- 【Luogu】P2894酒店Hotel(线段树)
题目链接 我好蒻啊 题题看题解 线段树维护从左端点开始的最长连续空房.右端点结束的最长连续空房.整段区间的最长连续空房.区间非空房的个数. http://blog.csdn.net/qq_3955 ...
- POJ 2396 Budget ——有上下界的网络流
给定矩阵的每行每列的和,和一些大于小于等于的限制.然后需要求出一组可行解. 上下界网络流. 大概的思想就是计算出每一个点他需要强行流入或者流出的量,然后建出超级源点和汇点,然后删除下界,就可以判断是否 ...
- eclipse中AXIS2发布过程
Axis2服务端研究好几个小时,终于解决了 需要下载: 地址1: 可以从镜像站下载: 上海大学开源镜像站 地址2: 链接:从百度网盘下载; 密码:8nwu 其中第二个可以不用下: 解压后 将3,4解压 ...
- 商务旅行(codevs 1036)
题目描述 Description 某首都城市的商人要经常到各城镇去做生意,他们按自己的路线去做,目的是为了更好的节约时间. 假设有N个城镇,首都编号为1,商人从首都出发,其他各城镇之间都有道路连接,任 ...
- net8:XML的读写操作【广告控件的XML文件实例】
原文发布时间为:2008-08-05 -- 来源于本人的百度文章 [由搬家工具导入] 【用了datalist控件,datalist控件自己学会,主要知道其他按钮COMMANDNAME属性应该改为edi ...