写道
package com.wang;
public class TestLoad {
private static TestLoad load=new TestLoad();
public static int count1;
public static int count2=0;
private TestLoad(){
count1++;
count2++;
}
public static TestLoad getInstance(){
return load;
}
public static void main(String[] args) {
TestLoad load=TestLoad.getInstance();
System.out.println("count1="+load.count1);
System.out.println("count2="+load.count2);
}
}
大家觉得这个代码的输出是什么?
答案是:
count1=1
count2=0
写道
package com.wang;
public class TestLoad {
public static int count1;
public static int count2=0;
private static TestLoad load=new TestLoad();
private TestLoad(){
count1++;
count2++;
}
public static TestLoad getInstance(){
return load;
}
public static void main(String[] args) {
TestLoad load=TestLoad.getInstance();
System.out.println("count1="+load.count1);
System.out.println("count2="+load.count2);
}
}
这个时候输出又是什么呢?
对了,是
count1=1
count2=1
这是什么原因造成的呢?
是因为在虚拟机加载类的机制造成的,
虚拟机设计类的加载顺序是:加载、链接、初始化。
加载是指:查找并加载类的二进制数据
链接又分如下三步:
–验证:确保被加载的类的正确性
–准备:为类的静态变量分配内存,并将其初始化为默认值
–解析:把类中的符号引用转换为直接引用
初始化是指:为类的静态变量赋予正确的初始值
其中说的准备和初始化都是指的对静态变量进行的,因为此时还没有实例。
造成上面输出结果的原因,也是在准备和初始化的顺序造成的。
在上面的代码中,当类加载的时候,会先执行准备操作,这个时候count1,count2都被初始化成默认值,也就是0,同时准备static TestLoad load=new TestLoad(); 这行代码的时候,会执行
private TestLoad(){
count1++;
count2++;
}
这个构造方法,此时,count1,count2都被符成了1,1;但是当类在初始化的时候,又重新把count2设置成了用户设置的初始值,也就是count2=0,而count1并没有初始值,所以count1的值还是1
而第二种情况是,static TestLoad load=new TestLoad(); 放到了两个变量已经有初始值(也就是已经完成了初始化操作)的情况下,再执行,所以count1,count2都会是1
分享到:
相关推荐
Java虚拟机类加载顺序,Java虚拟机类加载顺序,Java虚拟机类加载顺序
详细说明了tomcat启动过程中 加载资源的顺序
主要介绍了详解java中继承关系类加载顺序问题的相关资料,需要的朋友可以参考下
先静态代码块,然后构造代码块,再是构造方法,然后方法里面的代码块按顺序执行。 子类继承父类的时候,先执行父类的静态代码块,然后子类的静态代码块,然后父类的构造代码块和构造方法,再是子类的构造代码块和...
Java类加载顺序笔试题 Nicobar:Java 的动态脚本和模块加载器框架 Nicobar 是一个 Java 动态脚本框架,由强大的基于 . 脚本可以是源代码,用 JVM 兼容语言(如 Groovy)编写,也可以是编译后的字节码,以 .class ...
加载顺序讨论加载顺序讨论
java面试题静态加载顺序构造方法 继承与static 面试题目如下:请写出程序执行完成之后的结果。 package extend; public class X { Y y=new Y(); static{ System.out.println("tttt"); } X(){ System....
你是否曾经疑问过我们编写的内核模块是什么时候,如何加载到内核的,本文将为你揭开迷惑。
java程序在执行过程中,类,对象以及它们成员加载、初始化的顺序
Java类加载顺序笔试题KeePassJava2 大师: 发展: 用于与著名的 Windows 密码保险箱兼容的数据库的 Java 7 API。 迄今为止的功能: 读写 KeePass 2.x 格式 Keepass 2.x 密码和密钥文件凭证 读取 KeePass 1.x 格式...
Spring Bean 加载顺序 实验小例子
web.xml加载顺序,详解,帮助优化java web应用开发
描述了编译入内核的模块的加载顺序的原理和控制模块加载顺序的方法。
java 继承关系的加载顺序 java 继承关系的加载顺序
该项目展示spring配置文件的那些bean的加载顺序
Spring+SpringMVC配置加载顺序1
主要介绍了Java中类的加载顺序剖析(常用于面试题),本文直接给出代码实例和运行结果,给后给出了加载过程总结,需要的朋友可以参考下
struts2配置文件加载顺序
java的类加载机制,类加载顺序,类加载的体系结构,类加载过程,双亲委派模型及机制等相关内容。做架构师或者高级开发,类加载是必须要掌握的内容。
NULL 博文链接:https://xiaoxinshome.iteye.com/blog/1688607