如果不懂java中初始化过程,那么就不能称你懂java。今天我总结了一下java中的初始化过程。并通过一个例子加深理解。
当你运行一个java程序时,
1 首先计算机去找类的路径classpath(该路径是你设置的环境变量)
2 通过路径找到.class文件。
3 在JVM中进行类的加载,发现有父类 进行4
4 在classpath中找到父类的.class文件
5 对父类中静态资源进行初始化
6 对子类的静态资源初始化
7 如果主函数中有对象的产生 那么进行 8,9,10,11
8 父类成员属性的初始化
9 父类构造方法的初始化
10 子类成员属性的初始化
11 子类构造方法的初始化
下面一段代码可以加深理解
class Shape {
private static int i;
protected static int j=10;
Shape () {
System.out.println ("i = " + i + ", j = " + j);
j = 5;
}
private static int x1 = printInit("private Shape.x1 initialized"); //1
static int printInit(String s) {
System.out.println (s);
return ++i;
}
}
public class Circle extends Shape {
int k = printInit("Circle.k initialized");
public Circle () {
System.out.println ("k = " + k);
System.out.println ("j = " + j);
System.out.println ("x2 = " + x2);
super.printInit("super");
}
public static int x2 = printInit("public Circle.x2 initialized");
public static void main(String[] args) {
System.out.println ("Circle constructor");
Circle b = new Circle ();
System.out.println ("b.k="+b.k);
}
}
下面开始讨论这个例子
1 首先计算机去找类的路径classpath(该路径是你设置的环境变量)
2 通过路径找到Circle.class文件。
3 在JVM中进行类的加载,发现有父类 Shape进行4
4 在classpath中找到父类的 Shape.class文件
5 对父类中静态资源进行初始化 初始化结果:private static int i;初始化的时候如果没有赋值,基本类型都会被初始化为0,对象引用被初始化为null。这一句得到i=0;protected static int j=10;得到j=10;
private static int x1 = printInit("private Shape.x1 initialized"); //1
static int printInit(String s) {
System.out.println (s);
return ++i;
} 那么改程序的第一句将输出private Shape.x1 initialized;并且i=1;
6 对子类的静态资源初始化
public static int x2 = printInit("public Circle.x2 initialized");
那么将输出第二句public Circle.x2 initialized 并且i=2; x2=2
由public static void main(String[] args) {
System.out.println ("Circle constructor");
Circle b = new Circle ();
System.out.println ("b.k="+b.k);
} 将输出第三句:Circle constructor 。
7 主函数中有对象的产生 那么进行 8,9,10,11
8 父类成员属性的初始化 父类中没有成员属性
9 父类构造方法的初始化
Shape () {
System.out.println ("i = " + i + ", j = " + j);
j = 5;
}将输出i=2,j=10 然后j=5
10 子类成员属性的初始化
int k = printInit("Circle.k initialized");将输出:Circle.k initializd 然后i=3 k=3
11 子类构造方法的初始化
public Circle () {
System.out.println ("k = " + k);
System.out.println ("j = " + j);
System.out.println ("x2 = " + x2);
super.printInit("super");
} 将输出k=3 j=5 x2=2 super 并且i=4
System.out.println ("b.k="+b.k);
将输出结果 b.k=3
那么最终输出结果为
private Shape.x1 initialized
public Circle.x2 initialized
Circle constructor
i = 2, j = 10
Circle.k initialized
k = 3
j = 5
x2 = 2
super
b.k=3