Java类初始化顺序
[引言]
本文主要总结了java类的lifetime。包括从类的加载,link,initialize,以至对象的实例化和销毁。并结合jvm规范,略作解释。
1.测试用程序:
2.程序输出:
[正文]
Java对象的从无到有要经过类的加载,链接,初始化和对象的实例化这几个过程。从总体来说类的生命周期大致将其分为三个phase:
类型(类或者接口)的生命周期:从类型的initial entrance到最终退出虚拟机.
1.类生命周期的开始:装载,链接,初始化(幼年)
2.类生命周期的主要时期:对象实例化,终结(成年)
3.生命周期的末期:类的终结和卸载。(晚年)
Phase1:class lifetime
Class lifetime = class load + link + initialize
图1 类之初
Phase1-1:Load (3W)
1.what is “Load”?
装载指的是“jvm寻找一个具有特定名称的类或者接口的二进制形式,并使用这个二进制形式构造一个代表该类或者接口的Class对象的过程”。装载过程包括jvm的下列三个动作:
Ø 产生用于表达该类型(类或者接口)的二进制数据流(jvm or complier??)
Ø 在Method area,解析该二进制数据流成内部数据结构
Ø 产生表达该类型的java.lang.Class实例。(此处已经有instance生成了!)
java.lang.Class实例是加载步骤的最后产物,作为一个接口,服务于程序(class consumer)和内部数据结构(class representation)之间。为了存取存储于内部数据结构的类型信息,程序调用相关类型的class实例的方法。
2.when to “load”?
对于何时装载,jvm规范允许jvm设计者弹性实现。
以the command line为例:
java Terminator Hasta la vista Baby!
will start a Java virtual machine by invoking the method main of class Terminator
The initial attempt to execute the method main of class Terminator discovers that the class Terminator is not loaded-that is, the virtual machine does not currently contain a binary representation for this class. The virtual machine then uses a ClassLoader to attempt to find such a binary representation。
3.who performs“load”?
相关文档:
/*****************TestCar1 begin************************/
public class TestCar1 {
public static final int Ok=1; //正常情况
public static final int Wrong=2; //异常情况
public int run(){
if("车子没有出现故障"){  ......
编译并运行下面的程序,其结果是什么?
public class MyClass {
public static void main(String[] args) {
String str1 = "str1";
String str2 = "str2";
String str3 = "str3";
str1.concat(str2);
System.out.println(str3.concat(str1));
}
}
请选择正确的答案。
......
在应用程序中我们经常需要一个类去完成像数据处理、监听事件或检查另一个类的活动等任务。为了达到这个目标,我们可能使用带有一套锁和消息通知的线程。Java 线程API已经很好的文档化,但为了使线程能够正确而高效地运行,程序员仍然需要丰富的编程经验并编写大量的代码。通过应用本篇文章中讨论的框架,程序员能够避 ......
主要是举个例子说明一下什么用throws,什么时候用try-catch。
import java.io.BufferedReader;
import java.io.File;
import java.io.FileFilter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class Test {
public static void main(String[] ......