zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    JSK42586.Tree(动态开点线段树+树上启发式合并)
    CF1188B.Count Pairsl(数学)
    2021ICPC亚洲区域赛(昆明)复盘
    1009F.Dominant Indices (树上启发式合并)
    246E.Bloods Counsin Return(离线+树上启发式合并)
    208E.Blood Cousins(离线+倍增LCA+树上启发式合并)
    208E.Blood Cousins (离线+树上启发式合并)
    570D.Tree Requests (离线+树上启发式合并)
    Java从入门到实战之(6)SSM框架使用
    Java从入门到实战之(5)Java集合对比汇总
  • 原文地址:https://www.cnblogs.com/metoy/p/3887658.html
Copyright © 2011-2022 走看看