import java.util.Random;
class test1{
public static final int x = 6/2;
static {
System.out.println("test1 static block");
}
}
class test2{
public static final int x = new Random().nextInt();
static {
System.out.println("test2 static block");
}
}
public class Demo {
public static void main(String[] args) {
System.out.println("-------打印test1x---------");
System.out.println(test1.x);
System.out.println("-------打印test2x---------");
System.out.println(test2.x);
}
}
运行结果:
-------打印test1x---------
3
-------打印test2x---------
test2 static block
1398792214
为什么第二个打印静态代码块第一个没打印呢?原因是这样的test1里的x是编译时的常量不会对类进行初始化而test2中不是编译时常量 会对类进行初始化 所谓编译时常量就是指编译时就能确定它的值
当类初始化时 首先去初始化他的直接父类或间接父类 父类初始化完了 然后在初始化 但不会初始化实现的接口 该类本身
当初始化一个接口的时候不回去初始化它的父接口
package com.cn;
class Parent {
public static final int a = 3;
static {
System.out.println("parent static block");
}
}
class Child extends Parent{
public static final int b = 4;
static {
System.out.println("child static block");
}
}
public class J2SETest{
//这个静态代码会首先被执行
static {
System.out.println("J2SETest static block");
}
public static void main(String[] args) {
//执行这句话时是不会对Parent进行初始化的 因为只是对变量进行声明 并没有产生对象 只有 对类进行主动调用时才会被初始化
Parent parent ;
//这句话会对Parent进行初始化
parent = new Parent();
System.out.println(parent.a);
//这句话会首先去初始化父类 但父类在new Parent()这条语句时已经被初始化了
//所以不用重新初始化父类 而是直接初始化Child 但这只限于该Parent只被一个类加载器加载 如果被另一个加载器加载 会被重新初始化
//下面这条语句也是对Chid的主动调用 但b的值是编译时常量 在编译时它的值都已经确定了 所以Child里的静态代码块是不会被执行的
System.out.println(Child.b);
//现在大家可以猜一猜它的运行结果
//预测运行结果是:
//1. J2SETest static block
//2. parent static block
//3. 3
//4. 4
}
}
分享到:
相关推荐
深入Java虚拟机_ClassLoader深入Java虚拟机_ClassLoader
深入Java虚拟机_ClassLoader
深入Java虚拟机JVM类加载学习笔记:jvm java classloader 垃圾回收 gc
摘要视图订阅曹胜欢欢迎关注微信账号:java那些事:csh624366188.每天一篇java相关的文章登录 | 注册Java程序员从笨鸟到菜鸟(81)3054
北京圣思园深入Java虚拟机_ClassLoader.pdf 包含对java虚拟机方面知识的剖析
ClassLoader类加载器讲解,理解JAVA类加载机制
提供了访问该类在方法去内的数据结构的接口。...Java虚拟机自带的类加载器包括:启动类加载器,扩展类加载器,系统类加载器三种。 用户自定义的类加载器是ClassLoader类的实例,通过它来定制类的加载方式。
由Java虚拟机自带的默认加载器(根加载器、扩展加载器、系统加载器)所加载的类在JVM生命周期中始终不被卸载。所以这些类的Class对象(我称其为实例的模板对象)始终能被触及!而由用户自定义的类加载器所加载的类会...
Java虚拟机第二版(非扫描版).pdf 深入Java虚拟机_ClassLoader.pdf
类加载器是 Java 语言的一个创新,也是 Java 语言流行的重要原因之一。它使得 Java 类可以被动态加载到 Java 虚拟机中并执行。类加载器从 JDK 1.0 就出现了,最初是为了满足 Java Applet 的需要而开发出来的。Java ...
类加载器是 Java 语言的一个创新,也是 Java 语言流行的重要原因之一。它使得 Java 类可以被动态加载到 Java 虚拟机中并执行。类加载器从 JDK 1.0 就出现了,最初是为了满足 Java Applet 的需要而开发出来的。Java ...
ClassLoader,,深入java加载器,,深入java加载器源代码
java应用程序类加载器(ClassLoader for java Application),类似exe4j, 方便启动java程序, 配置灵活,支持多平台选择性配置
ClassLoader的API使用和自定义
【图解版】深入分析ClassLoader类加载工作机制,从原理到JVM的装载过程,详情分析了ClassLoader加载类以及自定义类加载器的过程,不可用于商业用途,如有版权问题,请联系删除!
类加载器分为根加载器(bootstrap classloader)、扩展类加载器(ext classloader)、系统类加载器(system classloader)、自定义类加载器(通常继承java.net.URLClassLoader,重写findClass()),它们的关系通常...
java自定义类加载classloader文档,包括代码,以及详细的原理及过程
java虚拟机的运行机理的详细介绍 Inside the Java Virtual Machine Bill Venners $39.95 0-07-913248-0 Inside the Java Virtual Machine Acknowledgments Introduction Part One: Java's Architecture 1 ...
深入了解Java_ClassLoader,Bytecde.pdf