刚刚在ITeye上看到一篇关于java代码初始化的文章,看到代码我试着推理了下结果,虽然是大学时代学的知识了,没想到还能做对。(看来自己大学时掌握的基础还算不错,(*^__^*) 嘻嘻……)但是博主写的不够详细具体,我想在这详细谈一下java代码的具体初始化过程。

  首先要清楚,初始化分为两个过程:类初始化、对象初始化。

  类初始化是指类加载器将类加载到内存时,对类成员的初始化过程,也就是有static修饰的变量。对于加载完的类,它的类变量都会赋一个默认值,即使你定义时就赋值了。比如int类型就是0,引用类型就是null。(语言有点苍白无力了,我还是直接上例子吧!)

public class Test {

	private static int number = 5;

	private static Object object = new Object();
}

  让我们来分析下这个实例,Test类有两个类成员变量,当类被加载完后就要进行类的初始化过程,虽然number和object都在定义时被赋予了值,但是他们还是首先被赋予0和null值,哪什么时候才将我们的5和object对象赋予呢?它是在编译后经过一个静态代码块赋值。所以他的实际初始化过程类似于如下代码:

public class Test {

	private static int number = 0;

	private static Object object = null;

	static{
number = 5;
object = new Object();
}
}

  对象初始化是指当我们创建对象时的初始化过程,它的初始化过程跟类初始化过程很相似,只是多了一个构造函数的过程。直接上代码:

public class Test {

	private  int number = 5;

	private  Object object = new Object();

	{//这是一个动态代码块,现实中很少用到,其实跟直接定义成员变量差不多
number = 6;
} public Test(){ }
}

  表达能力还真是有限,我还是感觉直接上代码说的清楚,它的实际初始化过程的类似于如下代码:

public class Test {

	private  int number = 0;

	private  Object object = null;

	public Test(){
number = 5;
object = new Object();
number = 6;
} }

  你没有看错,动态代码块直接就没了,赋值过程都被移到了构造方法中了。变量定义和动态代码块一样都是按照出现的顺序移到构造方法中的。

以上就是类初始化过程和对象初始化过程,不知道有没有说清楚,做几个小题测试一下吧^_^。(这里就直接拿刚才ITeye上看到的代码为例吧)

public class JvmTest {
private static JvmTest JvmTest = new JvmTest();
private static int count1;
private static int count2 = 5; public JvmTest() {
count1++;
count2++;
} public static JvmTest getInstance() {
return JvmTest;
} public static void main(String[] args) {
System.out.println("count1=" + JvmTest.count1);
System.out.println("count2=" + JvmTest.count2);
}
}

  不知道你能不能通过以上的讲解推理出打印什么值,这里我把实际初始化过程的代码发一下:

public class JvmTest {
private static JvmTest JvmTest = null;//这是系统默认赋值
private static int count1 = 0;//这是系统默认赋值
private static int count2 = 0;//这是系统默认赋值 static{
JvmTest = new JvmTest();
count2 = 5;
} public JvmTest() {
count1++;//执行++前值为0
count2++;//执行++前值为0
} public static JvmTest getInstance() {
return JvmTest;
} public static void main(String[] args) {
System.out.println("count1=" + JvmTest.count1);
System.out.println("count2=" + JvmTest.count2);
}
}

  不早了,准备谁家,大家晚安O(∩_∩)O

java代码的初始化过程研究的更多相关文章

  1. java 子类的实例化和代码块初始化过程

    1,子类的实例化 1,子父类中的构造函数的特点. 在子类构造对象时,发现,访问子类构造函数时,父类也运行了. 为什么呢? 原因是:在子类的构造函数中第一行有一个默认的隐式语句. super(); 子类 ...

  2. 【软件构造】-<笔记>-浅谈java中类的初始化过程

    编写java程序时,每创建一个新的对象,都会对对象的内容进行初始化. 每一个类的方法中的局部变量都有严格的初始化要求,因此假如写出下面的程序: void f(){ int i; i++; } 编译时就 ...

  3. 对一致性Hash算法,Java代码实现的深入研究(转)

    转载:http://www.cnblogs.com/xrq730/p/5186728.html 一致性Hash算法 关于一致性Hash算法,在我之前的博文中已经有多次提到了,MemCache超详细解读 ...

  4. 一道题反映Java的类初始化过程

    Java的类初始化过程: 1. 父类的static成员变量,static语句块. 2. 子类的static成员变量,static语句块. 3. 父类的普通成员变量,构造函数. 4. 子类的普通成员变量 ...

  5. 对一致性Hash算法,Java代码实现的深入研究

    一致性Hash算法 关于一致性Hash算法,在我之前的博文中已经有多次提到了,MemCache超详细解读一文中"一致性Hash算法"部分,对于为什么要使用一致性Hash算法.一致性 ...

  6. Java 中类的初始化过程

    先来一张 JVM 中的内存模型 . 在Java 虚拟机原理这本书中介绍了类会被初始化的 5 种情况 . 1 遇到 new getstatic putstatic 和 invokestatic 这 4 ...

  7. 【转载】对一致性Hash算法,Java代码实现的深入研究

    原文地址:http://www.cnblogs.com/xrq730/p/5186728.html 一致性Hash算法 关于一致性Hash算法,在我之前的博文中已经有多次提到了,MemCache超详细 ...

  8. JAVA对象的初始化过程

    出处:http://blog.csdn.net/andrew323/article/details/4665379 下面我们通过两个例题来说明对象的实例化过程. 例1:   编译并运行该程序会有以下输 ...

  9. Java中对象初始化过程

    Java为对象初始化提供了多种选项. 当new一个对象的时候,对象初始化开始: 1.首先,JVM加载类(只加载一次,所以,即使多次new对象,下面的代码也只会在第一次new的时候执行一次),此时, 静 ...

随机推荐

  1. nodejs之get/post请求的几种方式

    最近一段时间在学习前端向服务器发送数据和请求数据,下面总结了一下向服务器发送请求用get和post的几种不同请求方式: 1.用form表单的方法:(1)get方法 前端代码: <form act ...

  2. JavaScript自定义媒体播放器

    使用<audio>和<video>元素的play()和pause()方法,可以手工控制媒体文件的播放.组合使用属性.事件和这两个方法,很容易创建一个自定义的媒体播放器,如下面的 ...

  3. Java 堆内存与栈内存异同(Java Heap Memory vs Stack Memory Difference)

    --reference Java Heap Memory vs Stack Memory Difference 在数据结构中,堆和栈可以说是两种最基础的数据结构,而Java中的栈内存空间和堆内存空间有 ...

  4. Solr高级查询Facet

    一.什么是facet solr种以导航为目的的查询结果成为facet,在用户查询的结果上根据分类增加了count信息,然后用户根据count信息做进一步搜索. facet主要用于导航实现渐进式精确搜索 ...

  5. python10作业思路及源码:类Fabric主机管理程序开发(仅供参考)

    类Fabric主机管理程序开发 一,作业要求 1, 运行程序列出主机组或者主机列表(已完成) 2,选择指定主机或主机组(已完成) 3,选择主机或主机组传送文件(上传/下载)(已完成) 4,充分使用多线 ...

  6. JDBC Tutorials: Commit or Rollback transaction in finally block

    http://skeletoncoder.blogspot.com/2006/10/jdbc-tutorials-commit-or-rollback.html JDBC Tutorials: Com ...

  7. Help Hanzo (素数筛+区间枚举)

    Help Hanzo 题意:求a~b间素数个数(1 ≤ a ≤ b < 231, b - a ≤ 100000).     (全题在文末) 题解: a~b枚举必定TLE,普通打表MLE,真是头疼 ...

  8. EF里Guid类型数据的自增长、时间戳和复杂类型的用法

    通过前两章Lodging和Destination类的演示,大家肯定基本了解Code First是怎么玩的了,本章继续演示一些很实用的东西.文章的开头提示下:提供的demo为了后面演示效果,前面代码有些 ...

  9. ReactNative入门(安卓)——API(上)

    Alert - 弹窗 通过 Alert.alert() 方法调用唤起原生弹窗,点击会触发 onPress 回调(参考下方代码)并清除弹窗. import React, { AppRegistry, C ...

  10. 借助GitHub托管你的项目代码

    PS:话说自己注册了GitHub都很久了,却没有怎么去弄,现在系统学习一下,也把自己的学习经历总结下来share给大家,希望大家都能把GitHub用起来,把你的项目代码happy地托管起来! 一.基本 ...