刚刚在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. Ignite性能测试以及对redis的对比

    测试方法 为了对Ignite做一个基本了解,做了一个性能测试,测试方法也比较简单主要是针对client模式,因为这种方法和使用redis的方式特别像.测试方法很简单主要是下面几点: 不作参数优化,默认 ...

  2. 【.net 深呼吸】启动一个进程并实时获取状态信息

    地球人和火星人都知道,Process类既可以获取正在运行的进程,也可以启动一个新的进程.在79.77%应用场合,我们只需要让目标进程顺利启动就完事了,至于它执行了啥,有没有出错,啥时候退出就不管了. ...

  3. WPF 有用博客地址

    增加智能感知的RichTextBox扩展控件(WPF) WPF自定义控件与样式(3)-TextBox & RichTextBox & PasswordBox样式.水印.Label标签. ...

  4. mybatis plugins实现项目【全局】读写分离

    在之前的文章中讲述过数据库主从同步和通过注解来为部分方法切换数据源实现读写分离 注解实现读写分离: http://www.cnblogs.com/xiaochangwei/p/4961807.html ...

  5. Redis百亿级Key存储方案(转)

    1 需求背景 该应用场景为DMP缓存存储需求,DMP需要管理非常多的第三方id数据,其中包括各媒体cookie与自身cookie(以下统称supperid)的mapping关系,还包括了supperi ...

  6. Hibernate中事务的隔离级别设置

    Hibernate中事务的隔离级别,如下方法分别为1/2/4/8. 在Hibernate配置文件中设置,设置代码如下

  7. java中Action层、Service层和Dao层的功能区分

    Action/Service/DAO简介: Action是管理业务(Service)调度和管理跳转的. Service是管理具体的功能的. Action只负责管理,而Service负责实施. DAO只 ...

  8. [OC] NSURLSession

    有的程序员老了,还没听过NSURLSession 有的程序员还嫩,没用过NSURLConnection 有的程序员很单纯,他只知道AFN. NSURLConnection在iOS9被宣布弃用,NSUR ...

  9. WebAPI 2参数绑定方法

    简单类型参数 Example 1: Sending a simple parameter in the Url [RoutePrefix("api/values")] public ...

  10. 技术笔记:XMPP之openfire+spark+smack

    在即时通信这个领域目前只找到一个XMPP协议,在其协议基础上还是有许多成熟的产品,而且是开源的.所以还是想在这个领域多多了解一下. XMPP协议:具体的概念我就不写了,毕竟这东西网上到处是.简单的说就 ...