java实例块,关于Java的静态块与实例块

最近查看了一下JVM相关的资料,了解了一下JVM对类的执行过程,现在总结一下。

1.当一个类被第一次使用时,它需要被类加载器加载,而加载过程涉及以下两点:

(1)在加载一个类时,如果它的父类还未被加载,那么其父类必须先被加载;

(2)当类加载到内存之后,按照在代码中的出现顺序执行它的静态数据域和静态块。

2.调用一个类的构造函数时,调用过程涉及以下三点:

(1)调用父类的构造函数;

(2)按照在代码中出现顺序初始化实例数据域和实行实例块;

(3)执行其构造函数体。

理论还是得通过实践来证明的,下面以一个简单的例子来证明。

/**

*

* @author Sel

*

* 2014.3.29

*/

public class InitializationDemo {

public static void main(String[] args) {

new InitializationDemo();

}

public InitializationDemo() {

new B();

}

{

System.out.println("2. Initialization 的实例块。");

}

static {

System.out.println("1. Initialization 的静态块。");

}

}

class A {

A() {

System.out.println("6. A 的构造函数体。");

}

{

System.out.println("5. A 的实例块。");

}

static {

System.out.println("3. A 的静态块。");

}

}

class B extends A {

B() {

System.out.println("8. B 的构造函数体。");

}

{

System.out.println("7. B 的实例块。");

}

static {

System.out.println("4. B 的静态块。");

}

}

上面的例子在类中各个部分输出对应的文字,以便从输出中看出其执行顺序。

对应的输出如下:

1. Initialization 的静态块。

2. Initialization 的实例块。

3. A 的静态块。

4. B 的静态块。

5. A 的实例块。

6. A 的构造函数体。

7. B 的实例块。

8. B 的构造函数体。

由输出可以看出程序执行的顺序如下:

1.首先,要使用Initialization类,则加载Initialization类,所以它的静态块被执行,于是输出1;

2.程序调用Initialization的构造函数,所以Initialization类的实例块被执行,于是输出2;

3.然后,执行Initialization的构造函数体,即new B(),这时因为要使用类B,所以将其加载;

4.因为类B的父类为A,那么在加载B之前,要先加载A,所以这时候执行A的加载过程,即执行A的静态块,于是输出3;

5.A加载完之后,这时候就到B加载了,这时执行B的加载过程,即执行B的静态块,于是输出4;

6.加载完成后,这时候按照代码,执行new B(),即B的构造函数,所以这时又要先调用父类A的构造函数,于是这时依次执行A的实例块和构造函数体,输出5和6;

7.最后,终于到“真正”执行B的构造函数了(因为之前已经一直在说执行new B(),却是一直在调用其他),于是依次执行B的实例块和构造函数体,输出7和8。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值