`
zdb_cn
  • 浏览: 123857 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

java classLoader的加载中 static final 变量的初始化时机

阅读更多

class :

 

加载:

 

 

连接:

 

 

初始化:

 

当final 变量不能确定时:

 

package com.wonders.javase.classloader;

import java.util.Random;

class FinalTest1 {
	
	public static final int a = 2;
	
	public static int c = 5;
	
	static {
		System.out.println("final test1");
	}

}

class FinalTest2 {
	
	public static final int b = new Random().nextInt(100);
	
	static {
		System.out.println("Final Test2 static block");
	}
}

public class Test2 {

	public static void main(String[] args) {
		System.out.println(FinalTest1.a);
		//System.out.println(FinalTest1.c);
		System.out.println("========================");
		System.out.println(FinalTest2.b);
	}
}

 

结果:

2
========================
Final Test2 static block
36

 

 

而当final  变量是能确定为常量时:

package com.wonders.javase.classloader;

class Parent {
	static int a = 1;
	 static {
		 System.out.println("parent static block");
	 }
	 
	 public Parent() {
		 System.out.println("constructor  parent");
	 }
}

class Child extends Parent {
	static int b = 2;
	
	static {
		System.out.println("child static block ");
	}
	
	public Child() {
		System.out.println("constructor child ");
	}
}

public class Test1 {

	public static void main(String[] args) {
		System.out.println(Child.b);
		
		new Child();
	}
}

 

结果:

 

parent static block
child static block 
2
constructor  parent
constructor child 

 

分享到:
评论
1 楼 jaogoy 2016-04-28  
都没有结论啊。
看来非常量的初始化值会导致对应类被加载后才会初始化。

相关推荐

    Java类加载器ClassLoader用法解析

    类加载时机包括: * 创建类的实例,也就是 new 一个对象 * 访问某个类或接口的静态变量,或者对该静态变量赋值 * 调用类的静态方法 * 反射(Class.forName("com.lyj.load")) * 初始化一个类的子类(会首先初始化子...

    解析Java虚拟机中类的初始化及加载器的父委托机制

    在Java虚拟机(JVM)中,类的初始化和加载器的父委托机制是至关重要的概念,它们决定了类的生命周期和类加载的顺序。本文将深入探讨这两个主题,并结合命名空间等深层次的知识点进行讲解。 首先,我们来看类的初始...

    Top 1000 Java Interview Questions

    - Java中的局部变量没有默认值,如果不初始化它们,在使用前将会导致编译错误。 - 这是为了保证程序的安全性和可靠性。 11. **不传递参数运行Java类时主方法的参数值:** - 如果运行Java类时不传递任何命令行...

    【独家】【笔面试知识要点】25.ClassLoader接口抽象类与顶级class1

    类加载的过程包括加载、验证、准备、解析和初始化等步骤。 接口与抽象类是Java中两种不同的多态性实现方式。在【描述】中,它们的区别被强调。抽象类可以有非抽象方法,即可以提供方法的具体实现,而接口只能声明...

    Java 基础核心总结 +经典算法大全.rar

    类的初始化 成员初始化 构造器初始化初始化顺序 数组初始化 对象的销毁 对象作用域 this 和 super 访问控制权限继承 多态组合代理 向上转型static final 接口和抽象类接口 抽象类异常 认 识 Exception 什么是 ...

    JVM调优篇.pdf

    2. 扩展类加载器(Extension ClassLoader):负责加载JAVA_HOME\lib\ext目录中的,或通过java.ext.dirs系统变量指定路径中的类库。 3. 应用程序类加载器(Application ClassLoader):负责加载用户路径(classpath)...

    Java基础学习12.pdf

    类的加载通常发生在以下几种情况:创建新对象、继承、JVM指定启动类、访问静态变量或方法、使用`Class.forName()`以及对`static final`变量的引用。加载过程包括加载、连接(验证、准备、解析)和类的初始化(静态...

    JVM--内存与垃圾回收篇1

    类加载子系统,也被称为Class Loader SubSystem,其主要任务是从文件系统或网络中加载Class Files,这些文件是Java类的二进制表示。每个Class File的开头都有一个特定的文件标识符,以确保文件的合法性。类加载器...

    举例讲解Java的内部类与类的加载器

    类的加载器(ClassLoader)在Java中扮演着重要的角色。它是Java虚拟机(JVM)的一部分,负责加载类的字节码到内存中,将其转化为Class对象。ClassLoader的层次结构通常包括引导类加载器(Bootstrap ClassLoader)、...

    总结java常用API.doc

    ResourceBundle是Java中的一种资源绑定器,提供了多种资源加载方式。Properties是Java中的一种属性配置文件,提供了多种属性设置和获取方式。 9. Exceptions Exceptions是Java中的异常处理机制,提供了try-catch-...

    jvm笔记记录.docx

    - **准备**: 给类的非`final`修饰的`static`变量分配内存空间,并进行默认初始化。 - **解析**: 将常量池内的符号引用替换成直接引用。直接引用指的是直接指向目标的指针或偏移量等。 3. **初始化阶段**: - 执行...

    Java基础核心知识点总结(79页).pdf

    初始化有多种方式,如成员初始化块、构造器初始化块,以及初始化顺序规则。对象的作用域包括局部、成员和静态。this关键字用于引用当前对象,super用于访问父类的成员。 Java的访问控制权限有public、private、...

    java程序员面试大全

    在Java中,Servlet的生命周期包括初始化、服务请求和销毁。抽象类可以定义抽象方法,而且不能实例化。ArrayList是线程不安全的集合,若要按自定义方式有序存放数据,需要在插入时使用比较器(Comparator)。 线程...

    java高级工程师_面试题和答案解析.doc

    加载阶段找到类的字节码,验证确保字节码符合JVM规范,准备阶段为静态变量分配内存并初始化为默认值,解析则将符号引用转换为直接引用,初始化则执行类初始化方法()。 2. 栈内存与堆内存的区别 栈内存主要存储...

    java笔试题大全

    Java 类的加载过程主要包括加载、验证、准备、解析和初始化几个步骤。这个过程是由 Java 虚拟机的类加载器完成的。类的加载过程可以概括为以下几个阶段: 1. **加载(Loading):** 读取类的二进制数据到内存中。 ...

    java私塾面试题----JAVA基础3

    加载过程涉及找到类文件、读取二进制流、生成Class对象、解析符号引用以及初始化静态变量等步骤。 #### 7. 排序算法 排序算法是计算机科学的基础算法之一,常见的有: - 插入排序、希尔排序 - 冒泡排序、快速排序...

    JAVA-handbook.rar_Javahandbook_com.java.handbook_java chm_java 教

    - **变量和常量**:定义、声明和初始化变量,以及使用final关键字声明常量。 - **运算符和表达式**:介绍算术、比较、逻辑、位、赋值等各类运算符,以及表达式的求值规则。 - **流程控制**:涉及if条件语句,...

    Java基础教程.md.pdf

    - 初始化:`int[][] arr = {{1, 2}, {3, 4}};` #### 7. 流程控制语句 ##### 7.1 if-else语句 - 用于条件判断。 ##### 7.2 switch语句 - 用于多个条件分支的选择。 ##### 7.3 循环语句 - `while`循环 - `do......

    JAVA程序员面试题4

    - **加载过程:**加载、验证、准备、解析、初始化五个阶段。 - **双亲委派模型:**保证类的唯一性,提高系统的安全性。 #### 七、char型变量与中文字符 - **存储能力:**Java中`char`类型采用Unicode编码,占用16...

Global site tag (gtag.js) - Google Analytics