Java类的初始化顺序

    我把Java类的初始化顺序分为两部分。第一部分是类的初始化,第二部分是对象的初始化。

    在初始化之前JVM必须先把该类的字节码加载到内存中来。这时不管创不创建对象都会马上执行类的初始化

    执行静态初始化表达式(如static int a = 10)和静态初始化块(即static{}中的内容),注意两者按在源代码中的先后顺序执行。

    当创建一个对象,就会执行对象的初始化

    首先调用父类的构造函数。

    第二步执行初始化表达式(如int a = 10)和初始化块({}中的内容),同样按在源代码中的先后顺序执行。

    最后执行自身的构造函数。

   

    对于静态初始化表达式与初始化表达式,如果只是声明,没有初始化,则赋默认值。如int i;则i会被赋值为0。

 

总结:

   1、 类初始化

    (1) 静态初始化表达式,静态初始化块

    2、对象初始化

    (1)父类的构造函数

    (2)初始化表达式,初始化块

    (3)自身的构造函数

 

    注意:初始化表达式可能不是准确的术语,但明白是指什么就行了。

 

测试代码:

代码
package principle;

public class InitializeTest {

   
public static void main(String[] args) throws ClassNotFoundException{
        System.out.println(
"-----类初始化-----");
        Class.forName(
"principle.MyClass");
       
        System.out.println(
"\n" + "-----对象初始化-----");
        MyClass myClass
= new MyClass();
    }
}

class MyClass extends Father{
   
    MyClass() {
        System.out.println(
"3.自身的构造函数");
    }
   
   
static int staticInt = 5;    //如果放在static{}后面则编译不通过
   
   
static {
        System.out.print(
"1.静态初始化表达式:staticInt=" + staticInt + "\t");
        System.out.println(
"静态初始化块");
    }
   
   
int instanceInt;            //将会被赋默认值0
   
    {
        System.out.print(
"2.初始化表达式:instanceInt=" + instanceInt + "\t");
        System.out.println(
"初始化块");
    }
   
}

class Father {
    Father() {
        System.out.println(
"1.父类的构造函数");
    }
}

 

 

输出结果:

-----类初始化-----

1.静态初始化表达式:staticInt=5 静态初始化块

-----对象初始化-----

1.父类的构造函数

2.初始化表达式:instanceInt=0 初始化块

3.自身的构造函数

posted @ 2009-12-24 08:35  小冰  阅读(392)  评论(0编辑  收藏  举报