java代码的初始化过程研究
刚刚在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代码的初始化过程研究的更多相关文章
- java 子类的实例化和代码块初始化过程
1,子类的实例化 1,子父类中的构造函数的特点. 在子类构造对象时,发现,访问子类构造函数时,父类也运行了. 为什么呢? 原因是:在子类的构造函数中第一行有一个默认的隐式语句. super(); 子类 ...
- 【软件构造】-<笔记>-浅谈java中类的初始化过程
编写java程序时,每创建一个新的对象,都会对对象的内容进行初始化. 每一个类的方法中的局部变量都有严格的初始化要求,因此假如写出下面的程序: void f(){ int i; i++; } 编译时就 ...
- 对一致性Hash算法,Java代码实现的深入研究(转)
转载:http://www.cnblogs.com/xrq730/p/5186728.html 一致性Hash算法 关于一致性Hash算法,在我之前的博文中已经有多次提到了,MemCache超详细解读 ...
- 一道题反映Java的类初始化过程
Java的类初始化过程: 1. 父类的static成员变量,static语句块. 2. 子类的static成员变量,static语句块. 3. 父类的普通成员变量,构造函数. 4. 子类的普通成员变量 ...
- 对一致性Hash算法,Java代码实现的深入研究
一致性Hash算法 关于一致性Hash算法,在我之前的博文中已经有多次提到了,MemCache超详细解读一文中"一致性Hash算法"部分,对于为什么要使用一致性Hash算法.一致性 ...
- Java 中类的初始化过程
先来一张 JVM 中的内存模型 . 在Java 虚拟机原理这本书中介绍了类会被初始化的 5 种情况 . 1 遇到 new getstatic putstatic 和 invokestatic 这 4 ...
- 【转载】对一致性Hash算法,Java代码实现的深入研究
原文地址:http://www.cnblogs.com/xrq730/p/5186728.html 一致性Hash算法 关于一致性Hash算法,在我之前的博文中已经有多次提到了,MemCache超详细 ...
- JAVA对象的初始化过程
出处:http://blog.csdn.net/andrew323/article/details/4665379 下面我们通过两个例题来说明对象的实例化过程. 例1: 编译并运行该程序会有以下输 ...
- Java中对象初始化过程
Java为对象初始化提供了多种选项. 当new一个对象的时候,对象初始化开始: 1.首先,JVM加载类(只加载一次,所以,即使多次new对象,下面的代码也只会在第一次new的时候执行一次),此时, 静 ...
随机推荐
- Jquery 搭配 css 使用,简单有效
前几篇博客中讲了Jquery的基础和点击实际,下面来说一下和css搭配着来怎么做 还是和往常一样,举个例子 好几个方块,然后设置颜色 <!DOCTYPE html PUBLIC "-/ ...
- node中的cmd规范
你应该熟悉nodejs模块中的exports对象,你可以用它创建你的模块.例如:(假设这是rocker.js文件) exports.name = function() { console.log('M ...
- 使用 JavaScript 和 canvas 做精确的像素碰撞检测
原文地址:Pixel accurate collision detection with Javascript and Canvas 译者:nzbin 我正在开发一个需要再次使用碰撞检测的游戏.我通常 ...
- jQuery学习之路(2)-DOM操作
▓▓▓▓▓▓ 大致介绍 jQuery作为JavaScript库,继承并发扬了JavaScript对DOM对象操作的特性,使开发人员能方便的操作DOM对象. ▓▓▓▓▓▓ jQuery中的DOM操作 看 ...
- Asp.Net Core 项目实战之权限管理系统(4) 依赖注入、仓储、服务的多项目分层实现
0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...
- 计算Div标签内Checkbox个数或已被disabled的个数
先看下面的html: 计算div内的checkbox个数:$('#divmod input[type="checkbox"]').length 计算div内checkbox被dis ...
- ExtJS 项目准备工作(一)
首先,需要从网上下载两个文件,一个是SenchaCmd-6.2.0-windows-64bit(我的电脑是window 10 64位) 另一个是ExtJs6的源码包(ext-6.0.0.415). 源 ...
- Microsoft Visual Studio 2017 for Mac Preview 下载+安装+案例Demo
目录: 0. 前言 1. 在线安装器 2. 安装VS 3. HelloWorld 4. ASP.NET MVC 5. 软件下载 6. 结尾 0. 前言: 工作原因,上下班背着我的雷神,一个月瘦了10斤 ...
- 萌新笔记——linux下查看内存的使用情况
windows上有各种软件可以进行"一键加速"之类的操作,释放掉一些内存(虽然我暂时不知道是怎么办到的,有待后续学习).而任务管理器也可以很方便地查看各进程使用的内存情况,如下图: ...
- svnserver hook python
在使用中可能会遇到的错误排除 :1.Error: svn: 解析"D:\www\test"出错,或svn: E020024: Error resolving case of 'D: ...