类的初始化过程是这样的:按照顺序自上而下运行类中的变量赋值语句和静态语句,如果有父类,则首先按照顺序运行父类中的变量赋值语句和静态语句。先看一个例子,首先建两个类用来显示赋值操作:
- public class Field1{
- public Field1(){
- System.out.println("Field1构造方法");
- }
- }
- public class Field2{
- public Field2(){
- System.out.println("Field2构造方法");
- }
- }
|
下面是演示初始化顺序的代码:
- class InitClass2{
- static{
- System.out.println("运行父类静态代码");
- }
- public static Field1 f1 = new Field1();
- public static Field1 f2;
- }
-
- class SubInitClass2 extends InitClass2{
- static{
- System.out.println("运行子类静态代码");
- }
- public static Field2 f2 = new Field2();
- }
-
- public class Test2 {
- public static void main(String[] args) throws ClassNotFoundException{
- new SubInitClass2();
- }
- }
|
上面的代码中,初始化的顺序是:第03行,第05行,第11行,第13行。第04行是声明操作,没有赋值,所以不会被运行。而下面的代码:
- class InitClass2{
- public static Field1 f1 = new Field1();
- public static Field1 f2;
- static{
- System.out.println("运行父类静态代码");
- }
- }
-
- class SubInitClass2 extends InitClass2{
- public static Field2 f2 = new Field2();
- static{
- System.out.println("运行子类静态代码");
- }
- }
-
- public class Test2 {
- public static void main(String[] args) throws ClassNotFoundException{
- new SubInitClass2();
- }
- }
|
初始化顺序为:第02行、第05行、第10行、第12行,各位可以运行程序查看结果。
在类的初始化阶段,只会初始化与类相关的赋值语句和静态语句,也就是有static关键字修饰的信息,没有static修饰的赋值语句和静态语句在实例化对象的时候才会运行。
使用
类的使用包括主动引用和被动引用,主动引用在初始化的章节中已经说过了,下面我们主要来说一下被动引用:
● 引用父类的静态字段,只会引起父类的初始化,而不会引起子类的初始化。
● 定义类数组,不会引起类的初始化。
● 引用类的常量,不会引起类的初始化。