Java 初始化的个人理解
2014-03-30 19:59
232 查看
先说明一下由来吧,下面是同学的一道笔试题,以前感觉对java初始化也是了解一二的,结果,看到这题泪奔了,不会。。。上网查,自己添加println,总算是能把自己讲明吧了,不知理解的对不对,先记录下吧,也许以后再看,会发现这真是。。。幼稚
运行结果如图:
上面的说结果也是符合jvm加载类的一般步骤:
在Java中,类装载器把一个类装入Java虚拟机中,要经过三个步骤来完成:装载、链接和初始化,其中链接又可以分成校验、准备和解析三步,除了解析外,其它步骤是严格按照顺序完成的,各个步骤的主要工作如下:
装载:查找和导入类或接口的二进制数据;
链接:执行下面的校验、准备和解析步骤,其中解析步骤是可以选择的;
校验:检查导入类或接口的二进制数据的正确性;
准备:给类的静态变量分配并初始化存储空间;
解析:将符号引用转成直接引用;
初始化:激活类的静态变量的初始化Java代码和静态Java代码块。
初始化类中属性是静态代码块的常用用途,但只能使用一次。
按照上面的,在载入一个类的时候首先要做的是给它的静态变量分配存储空间,并设默认值(int等为0 object等为null),然后在按照声明(定义)静态变量的顺序,对其进行赋值。先是k = 0,然后t1 =new StaticFunction("t1");需要注意,一个类只载入一次,其静态变量是这个类共享的。所以开始执行 public int j = print("j");又因为此时n与i还处于默认值,所有输出为0即i = 0; n = 0。接着开始执行构造块,可以看到此时t1还是null,因为还没有执行构造函数,t1还没有初始化完毕,此时也就为null了,构造块之后便是构造函数了。还要注意的是现在还是执行的类中静态变量的初始化,还没有轮到静态块的执行。在t1,t2,n与i初始化之后才能执行static{};t2也是同样的操作,静态变量初始化完毕之后开始执行static{}。静态(类)操作完毕之后,开始main()。。。
public class StaticFunction { public static int k = 0; public static StaticFunction t1 = new StaticFunction("t1"); public static StaticFunction t2 = new StaticFunction("t2"); public static StaticFunction t3 = new StaticFunction("t1"); public static int i = print("i"); public static int n = 99; public int j = print("j"); { print("构造块"); System.out.println("t1:"+t1); System.out.println("t2:"+t2); System.out.println("j:"+j); } static { print("静态块"); System.out.println("t1:"+t1); System.out.println("t3:"+t3); System.out.println("t1.t1:"+t1.t1); System.out.println("t2.t1:"+t2.t1); System.out.println("t3.t1:"+t3.t1); System.out.println("t1.t1.t1:"+t1.t1.t1); System.out.println("t1.t2:"+t1.t2); System.out.println("t1.t2.t2:"+t1.t2.t2); System.out.println("t2.t2.t2:"+t2.t1.t2); if(t1 == t3) System.out.println("t1 == t3"); } public StaticFunction(String str) { System.out.println((++k) + ":" + str + " i=" + i + " n=" + n); ++i; ++n; } private static int print(String str) { System.out.println((++k)+":"+str+" i="+i+" n="+n); ++n; return ++i; } public static void main(String[] args) { System.out.println("Start...."); StaticFunction t=new StaticFunction("init"); System.out.println("Over...."); //System.out.println("j:"+j); } }
运行结果如图:
上面的说结果也是符合jvm加载类的一般步骤:
在Java中,类装载器把一个类装入Java虚拟机中,要经过三个步骤来完成:装载、链接和初始化,其中链接又可以分成校验、准备和解析三步,除了解析外,其它步骤是严格按照顺序完成的,各个步骤的主要工作如下:
装载:查找和导入类或接口的二进制数据;
链接:执行下面的校验、准备和解析步骤,其中解析步骤是可以选择的;
校验:检查导入类或接口的二进制数据的正确性;
准备:给类的静态变量分配并初始化存储空间;
解析:将符号引用转成直接引用;
初始化:激活类的静态变量的初始化Java代码和静态Java代码块。
初始化类中属性是静态代码块的常用用途,但只能使用一次。
按照上面的,在载入一个类的时候首先要做的是给它的静态变量分配存储空间,并设默认值(int等为0 object等为null),然后在按照声明(定义)静态变量的顺序,对其进行赋值。先是k = 0,然后t1 =new StaticFunction("t1");需要注意,一个类只载入一次,其静态变量是这个类共享的。所以开始执行 public int j = print("j");又因为此时n与i还处于默认值,所有输出为0即i = 0; n = 0。接着开始执行构造块,可以看到此时t1还是null,因为还没有执行构造函数,t1还没有初始化完毕,此时也就为null了,构造块之后便是构造函数了。还要注意的是现在还是执行的类中静态变量的初始化,还没有轮到静态块的执行。在t1,t2,n与i初始化之后才能执行static{};t2也是同样的操作,静态变量初始化完毕之后开始执行static{}。静态(类)操作完毕之后,开始main()。。。
相关文章推荐
- 深度理解JAVA本身的构造器及子父类构造方法的初始化顺序
- [原创]JAVA字符串池的个人理解,请各位高手指点!!
- JAVA中 子类与父类构造方法的关系 个人理解
- [深入理解JAVA虚拟机]读后个人总结二之JAVA内存区域
- 黑马程序员——Java基础之面向对象的相关概念及个人理解
- 个人理解java里的监听器与过滤器
- java 面向对象个人理解
- java中域的初始化,静态块和构造器的例子(考验一下初学者对于java的理解程度)
- Java之Checked Exception和Unchecked Exception使用的个人理解
- 黑马程序员——个人对JAVA反射的一些理解
- 用类名做方法的返回值类型 在学习Java的初始阶段,很多同学使用基本数据类型定义变量和引用类型定义变量以及使用类名做方法的返回值类型常常不知所以。今天我以自己的解读方式和个人的理解作一个简单的解释,和
- Java继承个人的理解
- 个人对Java中String对象的传递的理解(错误之处,请给与纠正,
- java中的值传递和引用传递的个人理解
- java的反射机制(个人理解)
- [置顶] 深入理解Java对象的创建过程:类的初始化与实例化
- java中IO的基本知识点及其个人理解
- java的引用传递 个人理解
- 深入理解jvm--Java类的初始化及主动引用和被动引用完全解析
- Java面向对象个人学习和理解