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类加载机制的代码实例的更多相关文章

  1. Java 类加载机制

    类的加载: 类的初始化: 类什么时候才被初始化:1)创建类的实例,也就是new一个对象2)访问某个类或接口的静态变量,或者对该静态变量赋值3)调用类的静态方法4)反射(Class.forName(&q ...

  2. Java类加载机制深度分析

    转自:http://my.oschina.net/xianggao/blog/70826 参考:http://www.ibm.com/developerworks/cn/java/j-lo-class ...

  3. 理解Java类加载机制(译文)

    理解java类加载机制 你想写类加载器?或者你遇到了ClassCastException异常,或者你遇到了奇怪的LinkageError状态约束异常.应该仔细看看java类的加载处理了. 什么是类加载 ...

  4. 两道面试题,带你解析Java类加载机制

    文章首发于[博客园-陈树义],点击跳转到原文<两道面试题,带你解析Java类加载机制> 在许多Java面试中,我们经常会看到关于Java类加载机制的考察,例如下面这道题: class Gr ...

  5. 【转】两道面试题,带你解析Java类加载机制(类初始化方法 和 对象初始化方法)

    本文转自 https://www.cnblogs.com/chanshuyi/p/the_java_class_load_mechamism.html 关键语句 我们只知道有一个构造方法,但实际上Ja ...

  6. Java类加载机制及自定义加载器

    转载:https://www.cnblogs.com/gdpuzxs/p/7044963.html Java类加载机制及自定义加载器 一:ClassLoader类加载器,主要的作用是将class文件加 ...

  7. Java类加载机制与Tomcat类加载器架构

    Java类加载机制 类加载器 虚拟机设计团队把类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类.实现这 ...

  8. 带你解析Java类加载机制

      目录 Java类加载机制的七个阶段 加载 验证 准备(重点) 解析 初始化(重点) 使用 卸载 实战分析 方法论 树义有话说 在许多Java面试中,我们经常会看到关于Java类加载机制的考察,例如 ...

  9. 深入理解和探究Java类加载机制

    深入理解和探究Java类加载机制---- 1.java.lang.ClassLoader类介绍 java.lang.ClassLoader类的基本职责就是根据一个指定的类的名称,找到或者生成其对应的字 ...

随机推荐

  1. python中获取python版本号的方法【转】

    原文 python3 #!/usr/bin/python # 第1种方法 import platform print(platform.python_version()) >>> i ...

  2. oracle create directory

    1.新建directory的语法 CREATE [OR REPLACE] DIRECTORY directory AS 'pathname'; 例如: create or replace direct ...

  3. BZOJ3611 [Heoi2014]大工程 【虚树】

    题目 国家有一个大工程,要给一个非常大的交通网络里建一些新的通道. 我们这个国家位置非常特殊,可以看成是一个单位边权的树,城市位于顶点上. 在 2 个国家 a,b 之间建一条新通道需要的代价为树上 a ...

  4. mysql查询死锁,执行语句,服务器状态等语句集合

    [转]http://blog.csdn.net/enweitech/article/details/52447006

  5. msp430项目编程45

    msp430综合项目---蓝牙控制系统45 1.电路工作原理 2.代码(显示部分) 3.代码(功能实现) 4.项目总结

  6. (11)UML设计视图

    UML的词汇表包含三种构造块:事物.关系和图 事物:事物是对模型中最具有代表性的成分的抽象 关系:把事物结合在一起 图:图聚集了相关的事物 一.事物 UML中有4种事物 (1)结构事物 UML 模型中 ...

  7. 【编码】封装RedisPubSub工具

    基本介绍 核心原理:利用Redis的List列表实现,发布事件对应rpush,订阅事件对应lpop 问题一:Redis不是自带Pub/Sub吗? redis自带的pub/sub有两个问题: 1.如果发 ...

  8. luogu P2912 [USACO08OCT]牧场散步Pasture Walking

    题目描述 The N cows (2 <= N <= 1,000) conveniently numbered 1..N are grazing among the N pastures ...

  9. codevs 2964公共素数因数

    2964 公共素数因数  时间限制: 1 s  空间限制: 32000 KB  题目等级 : 白银 Silver 题解       题目描述 Description 小单同学刚学习了一个数分解成几个素 ...

  10. PHP实现INT型,SHORT型,STRING转换成BYTE数组

    实现PHP实现INT型,SHORT型,STRING转换成BYTE数组的转化: class Bytes { public static function integerToBytes($val) { $ ...