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虚拟机(JVM)中ClassLoader部分的专著,旨在帮助读者深入理解Java程序如何加载、链接和初始化类。ClassLoader是Java平台核心特性的一部分,它负责查找和加载类到JVM...
《深入Java虚拟机(七)深入源码看java类加载器ClassLoader》 Java类加载器(ClassLoader)在Java运行环境中扮演着至关重要的角色。它负责将类的字节码加载到Java虚拟机(JVM)中,使得程序能够运行。ClassLoader是...
用户还可以自定义类加载器,继承`java.lang.ClassLoader`,实现自己的类加载策略。类加载器可以在预期需要某个类时预加载,但如果预加载失败,只有在类被首次主动使用时才会抛出错误。 连接阶段的验证是保证类正确...
在 Java 虚拟机(JVM)中,类加载器(ClassLoader)扮演着非常重要的角色。类加载器负责加载 Java 类,包括核心类和用户自定义类。在 JVM 运行过程中,类加载器会形成一个层次结构,包括引导类加载器(Bootstrap ...
类装载器分为启动类装载器(Bootstrap ClassLoader)、扩展类装载器(Extension ClassLoader)和应用程序类装载器(Application ClassLoader)。它们遵循双亲委托模型,即先由父类装载器尝试加载,如果失败再由子类...
- 自定义类加载器:可以通过继承ClassLoader实现自定义加载逻辑,例如加密类文件、从网络加载类等。 5. **JVM性能调优** - 分析工具:如JConsole、VisualVM、JProfiler等,帮助监控和诊断JVM状态。 - 日志与监控...
在Java编程中,类加载器(ClassLoader)扮演着至关重要的角色,它负责将类的.class文件加载到Java虚拟机(JVM)中,使程序得以运行。从JDK 2.0开始,Java引入了一种特殊的类加载策略——父亲委托机制,这一机制保证...
- **扩展类加载器(Extension ClassLoader)**:该类加载器负责加载`<JAVA_HOME>/lib/ext`目录下的类库,或者被`java.ext.dirs`系统变量所指定的路径中的所有类库。 - **应用类加载器(Application ClassLoader)**:也...
### Java ClassLoader (类加载器)详解 #### 一、教程提示 如果你正在查看这份文档,在线版中你可以点击下面的任何主题直接跳转到相应的部分。 1. **教程提示** 2. **介绍** 3. **类加载器结构** 4. **编译类加载...
JVM通过类加载器(ClassLoader)将.java编译成的.class文件加载到内存中。书中详细讲解了双亲委派模型,如何自定义类加载器以及类的生命周期。 3. **字节码与指令集** JVM执行的是字节码,书中会详细介绍每种字节...
类加载器是 Java 虚拟机中的一种机制,负责将类文件从文件系统加载到 JVM 的内存区域中。类加载器被组织成一种层级结构关系,也就是父子关系,其中 Bootstrap 是所有类加载器的父亲。 * Bootstrap class loader:...
【深入Java虚拟机(八)开发自己的类加载器 1】 在Java编程中,类加载器(ClassLoader)是Java虚拟机(JVM)的核心组成部分,它负责将类的字节码加载到JVM中并转化为Java类。通常,Java应用程序使用系统默认的类...
3. Application ClassLoader:也称为系统类加载器,负责加载用户类路径`-cp`或`-classpath`指定的所有类。 当一个类被加载时,如果它的父类加载器无法加载该类,那么会将任务委派给子类加载器。这就是著名的"委托...
- **系统类加载器(System ClassLoader)**:也称为应用类加载器,负责加载应用程序的类。 - **用户自定义的类加载器**:继承自`java.lang.ClassLoader`,可以根据需要定制类的加载方式。 2. **加载方式**: - ...
Java虚拟机(JVM)的类加载过程是Java程序运行的基础,它涉及到类加载器、类的生命周期和一系列复杂的步骤。在这个过程中,类加载器主要任务是根据类的全限定名加载二进制字节流并转化为`java.lang.Class`对象。整个...
Java应用程序类加载器是Java平台的核心组成部分之一,它负责加载应用程序中的类到JVM(Java虚拟机)中,使得程序能够执行。理解类加载器的工作原理对于深入学习Java编程至关重要。在Java中,类加载器按照层次结构...
Java类加载器分为三种主要类型:引导类加载器(Bootstrap ClassLoader)、扩展类加载器(Extension ClassLoader)和应用程序类加载器(Application ClassLoader,也称为系统类加载器)。它们共同工作,确保了Java...
ClassLoader是类加载器的实现,它的主要任务是加载Java类。Java的类加载机制遵循双亲委派模型,即一个类的加载请求会先由父类加载器处理,只有当父类加载器无法找到对应类时,才会由当前类加载器进行加载。这种设计...