`
wuzhixiuan
  • 浏览: 1908 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

java代码初始化流程研究

阅读更多

最近在研究java代码的生命周期。这其中遇到一个java代码初始化的问题。

代码如下:
  
public class JvmTest {
private static int count1;
private static int count2 = 0;
private static JvmTest JvmTest =new JvmTest();

public JvmTest() {
System.out.println("JvmTest");
count1++;
count2++;
}

public static JvmTest getInstance() {
return JvmTest;
}

public static void main(String[] args) {

System.err.println("count1=" + JvmTest.count1);
System.err.println("count2=" + JvmTest.count2);
}
}
这段代码运行之后的结果是什么呢?
如果你已经有答案了,请看下面这段代码:
public class JvmTest {
private static JvmTest JvmTest =new JvmTest();
private static int count1;
private static int count2 = 0;

public JvmTest() {
System.out.println("JvmTest");
count1++;
count2++;
}

public static JvmTest getInstance() {
return JvmTest;
}

public static void main(String[] args) {

System.err.println("count1=" + JvmTest.count1);
System.err.println("count2=" + JvmTest.count2);
}
}
这段运行结果又是什么呢?
我开始对运行结果也比较疑惑,然后仔细分析了一下,问题就出在java代码的初始化上。因为这个测试类是带有main函数的,它会在程序运行时即执行。所以这属于主动引用,这种情况会促使类的初始化。初始化过程中,在调用成员方法之前,它首先会按顺序对静态成员变量进行赋值,如果无值可赋就给一个默认值。说到这里我想上面两段代码的结果也就好解释了。
第一段首先count1和count2值都是0,一个是类加载过程中默认的0,一个是赋值为0,然后执行了new操作,对count1和count2进行自加,所以到这里,count1和count2的值都是1.而第二段则是先new操作对count1和count2都自加,变成1,然后再对count2进行赋值操作,所以count2的值又从1改成了0.

 

分享到:
评论

相关推荐

    Java代码初始化流程研究

    这其中遇到一个java代码初始化的问题。  代码如下: public class JvmTest { private static int count1; private static int count2 = 0; private static JvmTest JvmTest =new JvmTest(); public JvmTest()...

    java流程自动化工具

    三、应用部署:GIT代码拉取,MAVEN打包,SFTP上传,Linux脚本执行,自动化一气呵成,且轻松实现切换用户等交互性需求,数据初始化,多应用的启动顺序或特定条件触发,均可实现自动化操作。 四、模拟操作:接口调试,...

    java源码包---java 源码 大量 实例

    6个目标文件,EJB来模拟银行ATM机的流程及操作:获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用...

    JAVA上百实例源码以及开源项目源代码

    6个目标文件,EJB来模拟银行ATM机的流程及操作:获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用...

    Java源码包100个设计实例.zip

    ejbCreate函数用于初始化一个EJB实例 EJB中JNDI的使用源码例子 EJB的真实世界模型(源代码).rar ftp文件传输 ftp简易服务器.rar HAHA CHAT Java仿QQ聊天程序源代码.rar html 标记大全.rar iCHAT聊天室基于Java.rar ...

    JAVA上百实例源码以及开源项目

    6个目标文件,EJB来模拟银行ATM机的流程及操作:获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用...

    java数组初始化笔试题-yvm:[yvm]低性能垃圾回收jvm

    java数组初始化笔试题 | | | | | 这是一个用 C++ 编写的自制 Java 虚拟机,它支持大多数 Java 语言功能,并包含一个基于标记清除的并发垃圾收集器。 此 VM 的主要组件符合 . 它是可运行的,各种语言功能将逐步添加到...

    java源码包2

    6个目标文件,EJB来模拟银行ATM机的流程及操作:获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用...

    JAVA上百实例源码以及开源项目源代码 java开源包2

    6个目标文件,EJB来模拟银行ATM机的流程及操作:获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用...

    酒店管理系统JAVA源代码

    q 初始化系统:该功能用来对系统进行初始化,初始化后系统数据将全部被删除。 操作注意事项 用户在使用《酒店管理系统》之前,应注意以下事项: (1)管理员用户名和密码为:mr、mrsoft。 (2)当鼠标经过主界面右下...

    java源码包4

    6个目标文件,EJB来模拟银行ATM机的流程及操作:获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用...

    用蚁群优化算法 解决流水车间调度问题_java_代码_下载

    用于解决该问题的蚁群算法基于 Max-Min Ant System ...为此,我们使用框架上可用的信息素初始化策略StartPheromoneMatrix,并扩展更新策略以满足我们问题的需要。 更多详情、使用方法,请下载后阅读README.md文件

    java源码包3

    6个目标文件,EJB来模拟银行ATM机的流程及操作:获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用...

Global site tag (gtag.js) - Google Analytics