博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
初始化代码块
阅读量:7250 次
发布时间:2019-06-29

本文共 1752 字,大约阅读时间需要 5 分钟。

首先解释下,初始化代码块的定义,代码举例

public class Test {

 {
  //初始化代码块

 }

 Test(){
  System.out.println("constructor ");
 }
 int i = 0;
 public void print(){
  System.out.println("print");
 }

}

在类的里面,所有的方法的外面定义的代码块称之为初始化代码块如上。能够用static修饰初始化代码块,使之成为静态初始化代码块,如下例

public class Test {

 static{

   //静态初始化代码块

  System.out.println("static block");
 }
 Test(){
  System.out.println("constructor ");
 }
 int i = 0;
 public void print(){
  System.out.println("print");
 }

}

初始化代码块的执行时机,举例说明

package staticBlock;

public class Test {

 int i = 1;
 static{
  System.out.println("static initialize block");
 }
 {  
  System.out.println("i = "+ i);
  System.out.println("initialize block");
 }
 Test(){
  System.out.println("constructor ");
 }
 public static void print2(){
  System.out.println("static method");
 }
 
 public void print(){
  System.out.println("normal method");
 }
 
 public static void main(String [] args){
//  Test.print2();
  Test t = new Test();
  Test t2 = new Test();
  t2.print();
 }

}

 运行结果:

static initialize block

i = 1
initialize block
constructor
i = 1
initialize block
constructor
normal method

将注释的部分解开(绿色代码)运行结果如下:

static initialize block

static method
i = 1
initialize block
constructor
i = 1
initialize block
constructor
normal method

总结:

1.结果都是首先打印出static initialize block  说明静态初始化代码块的执行先于初始化代码块。

2.详细说明静态初始化代码块的执行时机。

首先无论是执行Test.print2();或者 Test t = new Test(); jvm都要从硬盘找到Test .class文件,读入这个文件,然后解释执行。读入这个文件的过程是这样的,jvm会自动通过CLASSPATH环境变量,去硬盘上寻找相应的Test .class文件,找到这个文件后,会把这个文件中所保存的Test类的信息读入到jvm中,并保存起来。上述的这个过程(黄绿色)称之为类加载,当jvm第一次遇到某个类时,就会执行这个类加载的过程,而静态初始化代码块会在类加载的时候执行,所以两个执行结果都是首先打印static initialize block

3.初始化代码块的执行时机。

打印了两次

i = 1

initialize block
constructor

而我们创建了两个对象,这说明初始化代码块是在我们创建对象时执行的,也就是说我们每次创建对象都要执行这个初始化代码块,而且是在对象的成员变量赋值之后,对象的构造器之前执行的。

转载于:https://www.cnblogs.com/shuaisam/archive/2012/03/27/2419356.html

你可能感兴趣的文章
通过阿里云APP,可以进行ECS,RDS 等实例的管理
查看>>
HBase-Region太多的问题简单总结
查看>>
说说我为什么看好Spring Cloud Alibaba
查看>>
STM32学习笔记(五)——通用定时器计数延时
查看>>
Android selector shape 无效问题
查看>>
Data Lake Analytics: 使用DataWorks来调度DLA任务
查看>>
zabbix配置web监控实现网页监控
查看>>
Postgresql lock锁等待检查
查看>>
codeforces1141D题解(暴力+贪心)
查看>>
Java Spring Boot 2.0实战MyBatis连接池阿里Druid与SQL性能监控
查看>>
信用算力基于 RocketMQ 实现金融级数据服务的实践
查看>>
基于oauth 2.0 实现第三方开放平台
查看>>
kubernetes1.4 基础篇:Learn Kubernetes 1.4 by 6 steps(1):概要
查看>>
百万下载量的 Android 应用后台收集用户信息
查看>>
SQL Server 多表数据增量获取和发布 1
查看>>
C3P0连接池
查看>>
这 25 个开源机器学习项目,一般人我不告诉 Ta
查看>>
【WePY小程序框架实战四】-使用async&await异步请求数据
查看>>
iOS UIImageView(图片)
查看>>
可折叠显示的发光搜索表单
查看>>