- 浏览: 190336 次
- 性别:
- 来自: 上海
文章分类
最新评论
在这个类第一次被调用或实例化的时候就会被执行(因为此时类开始加载)。
静态代码块只会执行一次,一般会用来初始化一些值,并且在所有对象中全局共享。
静态变量,静态方法,静态代码块是在加载类的时候执行的,只发布到tomcat服务器上,但是并没有加载这个类,也不执行,访问这个类的时候才开始加载。
类加载是为了执行静态方法
在第一次创建一个类的对象或者第一次调用一个类的静态属性和方法的时候,会发生类加载
类加载期间,如果发现有静态属性,就给对应的静态属性分配内存空间,并赋值
这个过程完成之后,今后在调用该类的静态属性,虚拟机会直接寻找改属性先前已经分配的内存空间地址,然后调用其值。同样,修改这个类的静态属性也一样
说白了,静态属性将永远占用某一块固定的内存空间,知道程序终止
但是这里有点说不通,假如一个静态的字符串,运行过程中,不断修改这个字符串的值,那么其内存空间就不可能固定,所以可以认为这个静态字符串的引用是固定的
java 类初始化过程
对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序依次是(静态变量、静态初始化块)>(变量、初始化块)>构造器
类加载到jvm需要经历如下几个过程:
一.加载
通过类的全限定名转换为二进制字节流,在jvm堆中生成代表这个Class的对象,作为方法区域的方法入口.
二.连接
1.验证:验证class的字节流是否对jvm虚拟机造成伤害,是否符合jvm的规范,这里包含几个验证.
2.准备:为类的static变量赋初始值,其中不包含类其它实例成员的初始化.
3.解析:将常量池内的符号引用替换成直接引用
三.初始化
这里是static{}块,构造函数,代码块{}的执行过程.
四.使用
对象的属性,方法等调用操作.
五.销毁
jvm通过确定对象没有引用后进行gc操作.
JRE 的依需求加载究竟是在什么时候把类加载进入内部的呢?
我们在定义一个类实例的时候,比如 TestClassA testClassA ,这个时候 testClassA 的值为 null ,也就是说还没有初始化,没有调用 TestClassA 的构造函数,只有当执行 testClassA = new TestClassA() 以后, JRE 才正真把 TestClassA 加载进来。
1. JAVA类装载器在装载类的时候是按需加载的,只有当一个类要使用(使用new 关键字来实例化一个类)的时候,类加载器才会加载这个类并初始化。
两种方法:
|
+-- 隐式的 : 使用new关键字让类加载器按需求载入所需的类
|
+-- 显式的 :
|
+-- 由 java.lang.Class的forName()方法加载
|
+-- 由 java.lang.ClassLoader的loadClass()方法加载
(1) 使用Class.forName()
Class.forName()方法具有两个重载的方法:
+- public static Class forName(String className)
|
+- public static Class forName(String className, boolean initialize,ClassLoader loader)
参数说明:
className - 所需类的完全限定名
initialize - 是否必须初始化类(静态代码块的初始化)
loader - 用于加载类的类加载器
调用只有一个参数的forName()方法等效于 Class.forName(className, true, loader)。
这两个方法,最后都要连接到原生方法forName0(),其定义如下:
private static native Class forName0(String name, boolean initialize,ClassLoader loader) throws ClassNotFoundException;
只有一个参数的forName()方法,最后调用的是:
forName0(className, true, ClassLoader.getCallerClassLoader());
而三个参数的forName(),最后调用的是:
forName0(name, initialize, loader);
所以,不管使用的是new 來实例化某个类、或是使用只有一个参数的Class.forName()方法,内部都隐含了“载入类 + 运行静态代码块”的步骤。而使用具有三个参数的Class.forName()方法时,如果第二个参数为false,那么类加载器只会加载类,而不会初始化静态代码块,只有当实例化这个类的时候,静态代码块才会被初始化,静态代码块是在类第一次实例化的时候才初始化的。
静态代码块只会执行一次,一般会用来初始化一些值,并且在所有对象中全局共享。
静态变量,静态方法,静态代码块是在加载类的时候执行的,只发布到tomcat服务器上,但是并没有加载这个类,也不执行,访问这个类的时候才开始加载。
类加载是为了执行静态方法
在第一次创建一个类的对象或者第一次调用一个类的静态属性和方法的时候,会发生类加载
类加载期间,如果发现有静态属性,就给对应的静态属性分配内存空间,并赋值
这个过程完成之后,今后在调用该类的静态属性,虚拟机会直接寻找改属性先前已经分配的内存空间地址,然后调用其值。同样,修改这个类的静态属性也一样
说白了,静态属性将永远占用某一块固定的内存空间,知道程序终止
但是这里有点说不通,假如一个静态的字符串,运行过程中,不断修改这个字符串的值,那么其内存空间就不可能固定,所以可以认为这个静态字符串的引用是固定的
java 类初始化过程
对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序依次是(静态变量、静态初始化块)>(变量、初始化块)>构造器
类加载到jvm需要经历如下几个过程:
一.加载
通过类的全限定名转换为二进制字节流,在jvm堆中生成代表这个Class的对象,作为方法区域的方法入口.
二.连接
1.验证:验证class的字节流是否对jvm虚拟机造成伤害,是否符合jvm的规范,这里包含几个验证.
2.准备:为类的static变量赋初始值,其中不包含类其它实例成员的初始化.
3.解析:将常量池内的符号引用替换成直接引用
三.初始化
这里是static{}块,构造函数,代码块{}的执行过程.
四.使用
对象的属性,方法等调用操作.
五.销毁
jvm通过确定对象没有引用后进行gc操作.
JRE 的依需求加载究竟是在什么时候把类加载进入内部的呢?
我们在定义一个类实例的时候,比如 TestClassA testClassA ,这个时候 testClassA 的值为 null ,也就是说还没有初始化,没有调用 TestClassA 的构造函数,只有当执行 testClassA = new TestClassA() 以后, JRE 才正真把 TestClassA 加载进来。
1. JAVA类装载器在装载类的时候是按需加载的,只有当一个类要使用(使用new 关键字来实例化一个类)的时候,类加载器才会加载这个类并初始化。
两种方法:
|
+-- 隐式的 : 使用new关键字让类加载器按需求载入所需的类
|
+-- 显式的 :
|
+-- 由 java.lang.Class的forName()方法加载
|
+-- 由 java.lang.ClassLoader的loadClass()方法加载
(1) 使用Class.forName()
Class.forName()方法具有两个重载的方法:
+- public static Class forName(String className)
|
+- public static Class forName(String className, boolean initialize,ClassLoader loader)
参数说明:
className - 所需类的完全限定名
initialize - 是否必须初始化类(静态代码块的初始化)
loader - 用于加载类的类加载器
调用只有一个参数的forName()方法等效于 Class.forName(className, true, loader)。
这两个方法,最后都要连接到原生方法forName0(),其定义如下:
private static native Class forName0(String name, boolean initialize,ClassLoader loader) throws ClassNotFoundException;
只有一个参数的forName()方法,最后调用的是:
forName0(className, true, ClassLoader.getCallerClassLoader());
而三个参数的forName(),最后调用的是:
forName0(name, initialize, loader);
所以,不管使用的是new 來实例化某个类、或是使用只有一个参数的Class.forName()方法,内部都隐含了“载入类 + 运行静态代码块”的步骤。而使用具有三个参数的Class.forName()方法时,如果第二个参数为false,那么类加载器只会加载类,而不会初始化静态代码块,只有当实例化这个类的时候,静态代码块才会被初始化,静态代码块是在类第一次实例化的时候才初始化的。
发表评论
文章已被作者锁定,不允许评论。
-
ReentrantLock与Condition
2017-03-17 14:25 532多线程和并发性并不是什么新内容,但是 Java 语言设计中的创 ... -
java linux监控
2017-03-13 17:49 502http://agapple.iteye.com/blog/1 ... -
transient和volatile两个关键字
2017-02-16 09:47 576transient和volatile两个关 ... -
java 锁机制
2016-12-09 13:43 481一段synchronized的代码被 ... -
java 正则表达式
2016-12-02 10:28 523众所周知,在程序开发中,难免会遇到需要匹配、查找、替换、判断字 ... -
java ClassNotFoundException和NoClassDefFoundException的差别
2016-08-17 19:47 913首先从名字上可以看出一类是异常,一类属于错误。异常可以通过异常 ... -
ThreadLocal
2016-07-19 11:10 336ThreadLocal是什么 Thre ... -
java CAS
2016-07-10 14:55 348cas 乐观锁每次不锁定整个线程,在操作之前进行判断。悲观锁独 ... -
concurrenthashmap
2016-07-10 11:11 426hash table虽然性能上不如 ... -
java 线程池的使用
2016-07-10 09:52 3771. 引言 合理利用线程池能够带来三个好处。第一:降低资源消 ... -
java.util.concurrent
2016-07-03 16:24 413我们都知道,在JDK1.5之 ... -
JVM 配置 以及垃圾收集器的选择
2016-04-15 12:36 735JVM监控的关键指标说明: a) FGC的环比增加次数。Zab ... -
jvm实时监控工具
2016-04-09 09:35 474 -
哈希 、一致性哈希、余数式哈希
2016-04-07 16:10 869什么是Hash Hash,一 ... -
jvm dump 相关
2016-03-22 17:22 685http://www.cnblogs.com/edwardla ... -
深入剖析volatile关键字
2016-03-21 16:02 554深入剖析volatile关键字 ... -
java线程安全问题之静态变量、实例变量、局部变量
2016-03-08 12:52 578java多线程编程中,存在很多线程安全问题,至于什么是线程安全 ... -
有状态的bean和无状态的bean的区别
2016-03-08 11:23 1527有状态会话bean :每个用户有自己特有的一个实例,在用户的生 ... -
Java nio详解
2016-01-20 16:30 557http://www.ibm.com/developerwor ... -
java 不定长数组
2015-11-24 15:00 795在调用某个方法时,若是方法的参数个数事先无法确定该如何处理 ...
相关推荐
Java 类加载器静态变量初始化机制详解 Java 类加载器是 Java 语言的核心组件之一,负责将 Java 字节码文件加载到内存中,以便 JVM 可以执行它们。在 Java 中,类加载器是通过委派机制来实现的,即一个类加载器可以...
静态初始化块是以`static`关键字标识的代码块,它在类被加载到Java虚拟机(JVM)时执行,且只执行一次。静态初始化块常用于设置类级别的变量,或者执行只应执行一次的初始化操作。例如,如果一个类需要在程序运行前...
Java编程语言中,静态块(static block)和初始化块(instance initialization block)是两种特殊的代码块,它们在程序运行的不同阶段被执行,对于类和对象的初始化有着重要作用。同时,`main`方法是Java程序的入口...
- **静态块**:在类加载时执行的代码块,主要用于初始化静态域。 - **非静态块(实例初始化块)**:在每次创建类的新实例时执行的代码块,用于初始化非静态域。 - **构造函数**:用于初始化新创建的对象的方法。 ##...
首先,静态代码块是在类被加载到JVM(Java虚拟机)时执行的一段代码,它不依赖于类的实例创建,而是与类本身绑定。静态代码块常用于初始化静态变量或进行一次性的系统设置。例如,在本案例中,可能是在程序启动时...
在 Java 中,静态数据初始化是指在类加载过程中对静态变量的初始化。静态变量是在类加载时被初始化的,而不是在实例创建时。静态变量的初始化顺序是按照它们在类中的定义顺序进行的。 在 Java 中有两种类型的变量:...
此外,静态初始化块只在类加载时执行一次,而初始化块(也称为实例初始化块)会在每次创建类的新实例时执行。这意味着静态成员和静态初始化块对于所有类的实例都是共享的,而实例成员和实例初始化块则是每个对象独有...
静态初始化块由 `static` 关键字修饰,它与类相关而不是与对象相关。这意味着静态初始化块在类被加载到JVM中时执行,而不是在创建每个对象时执行。静态初始化块主要用于初始化类级别的变量,即静态变量。由于它是在...
1. **目的不同**:静态方法用于执行与类相关的操作,而静态块用于类的初始化,尤其是在类加载时对静态资源进行初始化。 2. **调用方式不同**:静态方法可以通过类名直接调用,而静态块是由JVM自动执行的,无法直接...
其中,初始化阶段会执行类的静态代码块,这是`Class.forName()`方法中`initialize`参数所控制的行为。 总之,Java类加载器是Java语言强大灵活性和动态性的体现,通过合理的类加载策略,可以实现更高效、安全的应用...
静态初始化块用于初始化类级别的静态变量,它们只在类加载时执行一次。 2. **成员变量初始化**:接下来,初始化父类的非静态成员变量,这是通过调用父类的构造器实现的。Java规定每个子类实例在构造之前必须先调用...
6. **类初始化与类加载器**: - 类的初始化是由对应的类加载器触发的,当且仅当以下条件之一满足时: - 遇到new关键字实例化对象; - 遇到静态字段(非final)并对其进行访问; - 遇到静态方法的调用; - 使用...
Java初始化与方法是Java编程语言中的核心概念,它们在程序执行过程中起着至关重要的作用。本文将深入探讨Java中的初始化过程、方法的定义与调用,以及与之相关的源码和工具应用。 首先,让我们从类的初始化开始。在...
3. **静态初始化块(Static Initialization Blocks)**:在类加载时执行,仅执行一次。 4. **实例初始化块(Instance Initialization Blocks)**:在每个对象创建时执行。 5. **构造方法(Constructors)**:用于...
`()`方法由编译器自动收集类中的所有类变量的初始化语句和静态初始化块中的语句合并产生的。该方法用于为类变量赋值。 #### 二、动态代理 ##### 2.1 字节码的来源 动态代理是一种在运行时创建代理类的技术。代理...
总之,Java代码的初始化顺序是类加载的必然过程,涉及到静态和实例初始化块、构造函数、成员变量初始化以及继承关系的影响。这个demo是学习和理解这些概念的重要工具,通过实际操作可以加深对Java内存管理和对象生命...
在Java编程语言中,ClassLoader是核心组件之一,它负责加载类到JVM(Java虚拟机)中。...通过学习这些知识点,开发者可以更好地优化代码、设计更健壮的系统,并解决与类加载和初始化相关的复杂问题。