对Java类加载、实例化执行过程的理解
2013-12-08 12:10
417 查看
转载:http://student.csdn.net/space.php?uid=120826&do=blog&id=13762
Thinking in Java告诉我,每当执行Java编译器的时候,编译器会寻找指定的类,当它找到类时,首先需要初始化static变量,因为这些成员可以在没有实例的情况下运行,接着,再按照变量的声明顺序依次初始化类的成员,成员初始化完毕之后才为自己调用构造器,一切进行完毕之后,才可以调用方法。但主类比较特殊,主方法会在构造器之前,static变量初始化之后调用,这是由于Java的惰性初始化,在main方法被调用之前无法知道是否存在主类的实例。
Java的初始化和构造的分离使得Java提供了代码块作为初始化成员的工具和支持无名类的利器,而这样一来,初始化的工作就不免会被扩展,程序员可以嵌入额外的初始化步骤。由于Java的成员分普通成员和static成员,初始化代码块也分static的,例如:
public class Foo{
int a;
int b;
static int c;
{
a=-1;
b=1;
}//这个就是所谓的初始化代码块
static {
c=100;
}//static成员有专属的static初始化代码块
Foo(){Syetem.out.println("Foo creat now!")}
}
=======================================================
Class c = Class.forName(args[0],true,off.getClass().getClassLoader());
一个类的运行,JVM做会以下几件事情:
1、类装载
2、链接
3、初始化
4、实例化
而初始化阶段做的事情是初始化静态变量和执行静态方法等的工作。所以,当Class.forName(args[0],true,off.getClass().getClassLoader());中的true变为false的时候,就是告诉JVM不需再load
class之后进行initial的工作。这样,将initial的工作推迟到了newInstance的时候进行。所以,static块的绝对不是什么“只是在类被第一次实体化的时候才会被仅仅调用一次”,而应该是在类被初始化的时候,仅仅调用一次。
Thinking in Java告诉我,每当执行Java编译器的时候,编译器会寻找指定的类,当它找到类时,首先需要初始化static变量,因为这些成员可以在没有实例的情况下运行,接着,再按照变量的声明顺序依次初始化类的成员,成员初始化完毕之后才为自己调用构造器,一切进行完毕之后,才可以调用方法。但主类比较特殊,主方法会在构造器之前,static变量初始化之后调用,这是由于Java的惰性初始化,在main方法被调用之前无法知道是否存在主类的实例。
Java的初始化和构造的分离使得Java提供了代码块作为初始化成员的工具和支持无名类的利器,而这样一来,初始化的工作就不免会被扩展,程序员可以嵌入额外的初始化步骤。由于Java的成员分普通成员和static成员,初始化代码块也分static的,例如:
public class Foo{
int a;
int b;
static int c;
{
a=-1;
b=1;
}//这个就是所谓的初始化代码块
static {
c=100;
}//static成员有专属的static初始化代码块
Foo(){Syetem.out.println("Foo creat now!")}
}
=======================================================
Class c = Class.forName(args[0],true,off.getClass().getClassLoader());
一个类的运行,JVM做会以下几件事情:
1、类装载
2、链接
3、初始化
4、实例化
而初始化阶段做的事情是初始化静态变量和执行静态方法等的工作。所以,当Class.forName(args[0],true,off.getClass().getClassLoader());中的true变为false的时候,就是告诉JVM不需再load
class之后进行initial的工作。这样,将initial的工作推迟到了newInstance的时候进行。所以,static块的绝对不是什么“只是在类被第一次实体化的时候才会被仅仅调用一次”,而应该是在类被初始化的时候,仅仅调用一次。
相关文章推荐
- 对Java类加载、实例化执行过程的理解
- java类加载和实例化:静态代码块、初始化代码块、构造方法的执行顺序
- 深入理解Java类实例化时jvm执行顺序
- Java类加载与实例化过程
- 深入理解PHP代码的执行的过程
- 关于fork&exec之进程的创建和可执行程序的加载过程
- java类的加载过程和类加载器的分析
- 了解51单片机执行指令的过程,你会理解更深刻!
- mybatis源码学习之执行过程分析(0)——配置文件加载(io包)
- 有关分散加载文件scatter的理解 关键是加载域 加载地址与执行域地址的 处理
- 程序执行过程理解
- Java类加载过程浅析
- 可执行程序加载到内存的过程
- 对于HTML页面中CSS, JS, HTML的加载与执行过程的简单分析
- 从java虚拟机字节码执行引擎的执行过程来彻底理解java的多态性
- 好文转载:ELF文件格式及程序加载执行过程总汇
- java类加载,反射,动态代理入门理解
- 类的加载、实例化、初始化的区别和执行顺序
- 从一道面试题来认识java类加载时机与过程
- 执行的前戏------编译连接全过程理解