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类的基本职责就是根据一个指定的类的名称,找到或者生成其对应的字 ...
随机推荐
- zoj 2830 Champion of the Swordsmanship
Champion of the Swordsmanship Time Limit: 2 Seconds Memory Limit: 65536 KB In Zhejiang Universi ...
- C++之字符串表达式求值
关于字符串表达式求值,应该是程序猿们机试或者面试时候常见问题之一,昨天参加国内某IT的机试,压轴便为此题,今天抽空对其进行了研究. 算术表达式中最常见的表示法形式有 中缀.前缀和 后缀表示法.中缀表示 ...
- 【扩展kmp+最小循环节】HDU 4333 Revolving Digits
http://acm.hdu.edu.cn/showproblem.php?pid=4333 [题意] 给定一个数字<=10^100000,每次将该数的第一位放到放到最后一位,求所有组成的不同的 ...
- LightOJ1125 Divisible Group Sums
Divisible Group Sums Given a list of N numbers you will be allowed to choose any M of them. So you c ...
- AtCoder Regular Contest 074F - Lotus Leaves
$n \leq 300,m \leq 300$,$n*m$的格子里有起点有终点有空地有障碍,人会从起点选一个同行或同列空地跳过去,然后一直这样跳到终点.求至少删掉多少格子使得人跳不到终点. 首先S和T ...
- 星球大战 BZOJ 1015
星球大战 [问题描述] 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系.某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这些星球通过 ...
- 定时任务-Quartz
Quartz Quartz w3c教程 参考:https://blog.csdn.net/lkl_csdn/article/details/73613033 Quartz 的使用 https://ww ...
- Xen虚拟化
Xen虚拟化基础 Xen虚拟化类型 hypervisor Xen组件 Xen hypervisor Colletion CPU.Memory.Interrupter Domain0 ---> D ...
- android调用邮件应用发送email
直接贴代码: Intent intent = new Intent(android.content.Intent.ACTION_SEND); // 附件 File file = new File(En ...
- seo优化入门教程:认识搜索引擎
对于从来没有学过seo或者零基础的人来说,搜索引擎可能都不太了解.所以我们先来认识搜索引擎有哪些,同时为什么我们要学习搜索引擎优化. 从目前全球的一个搜索引擎来说的话,他的分支是非常多的,甚至可以讲, ...