Java对象的初始化过程研究与探索

栏目:Java基础 作者:admin 日期:2015-06-06 评论:0 点击: 1,422 次

准备工作:

在研究对象的初始化过程的之前,先建立一个类,如下所示。为了更清楚的认识类的初始化过程,我使用了初始化块来打印出相关的数据状态。
class Person {
    private static Person person= new Person();
    public  static int count1;
    public  static int count2 = 5;
    public int count3;
    
    static
    {
        System.out.println("[静态初始化块]count2="+count2);
        System.out.println("[静态初始化块]person="+person);
    }
    
    private Person() {
        count1++;
        count2++;
        System.out.println("[执行Person构造函数]count1="+count1);
        System.out.println("[执行Person构造函数]count2="+count2);
    }
    
     public static Person getInstance()  
     {  
            return person;  
     }
    {
            System.out.println("[初始化块]count3="+count3);
            System.out.println("[初始化块]person="+person);
    }
    
    public Person(int count)
    {
        this.count3=count;
        System.out.println("[构造函数初始化]count3="+count3);
    }
    
}

测试类的设计:

public class Test
{

    public static void main(String[] args)
    {
            System.out.println("[新建变量]person");
            Person person;
           
            System.out.println("[执行构造函数导致变量初始化]");
            person= new Person(10);    
            
            System.out.println("[执行类的静态函数]");
            Person.getInstance();
                
    }
}

运行结果:

[新建变量]person
[执行构造函数导致变量初始化]
[初始化块]count3=0
[初始化块]person=null
[执行Person构造函数]count1=1
[执行Person构造函数]count2=1
[静态初始化块]count2=5
[静态初始化块]person=Person@757aef
[初始化块]count3=0
[初始化块]person=Person@757aef
[构造函数初始化]count3=10
[执行类的静态函数]

结果分析:

(1)Person person;此句话表明jvm建立一个变量,类型为Person,此时Person还没有加载。
(2)person= new Person(10);此句话表明jvm先加载Person类,并进行初始化。Person类的初始化顺序为:
第一步:初始化静态变量person。此处通过Person的构造函数来初始化,所以又分为两步:执行初始化块和执行构造函数。
第二步:执行静态初始化块。
Person类初始化之后,开始构造person对象,执行的的顺序为:执行初始化块和执行构造函数。总之,概况的说:person= new Person(10);的底层实现是先加载并初始化Person的静态变量,然后初始化Person对象。

声明:
本文由金丝燕网原创编译,转载请保留链接: Java对象的初始化过程研究与探索
本站技术交流群,力争解决每一个问题:JAVA交流

Java对象的初始化过程研究与探索:等您坐沙发呢!

发表评论