类的初始化&实例化顺序

讲到类的初始化和实例化(见我的《Class的生命周期》),不得不提提初始化和实例化的顺序,我想这也是一直困扰了很大一部分人。

         从大流程来说,类肯定是先初始化,再实例化的,这里得出第一个顺序:

静态域 --> 实例域 --> 构造函数。另外要符合任何子类的动作都会触发父类:父类 --> 子类。所以得出原则:【先静态后实例;先父类后子类

         而且同一个域的顺序可以分成两步: 创建-->赋值

         对于静态域,其先经过链接创建静态变量,赋default值;再到初始化阶段给静态变量赋assign值和执行静态代码块。同理于实例域,也是分成创建和赋值两个部分,不同的只是加入构造函数(形参和代码块):先创建实例变量和构造函数形参以default值,然后对变量和形参赋assign值和执行实例代码块,最后执行构造函数的代码。 

         前提先要执行父类,再到子类;另外同一层次的就按从上到下顺序执行,如下面例子。

package com.jscai.java.classLoader;


public class LoaderLazy {
    {
        System.out.println("Parent Instance Code");
    }
    private PrintTmp p1 = new PrintTmp("Parent Instance Member");
    
    static {
        System.out.println("Parent Static Code");
    }
    private static PrintTmp p2 = new PrintTmp("Parent Static Member");


    public LoaderLazy() {
        System.out.println("Parent Constuctor");
    }
}


class SubLoaderLazy extends LoaderLazy {
    {
        System.out.println("Sub Instance Code");
    }
    private PrintTmp p1 = new PrintTmp("Sub Instance Member");
    
    static {
        System.out.println("Sub Static Code");
    }
    private static PrintTmp p2 = new PrintTmp("Sub Static Member");


    public SubLoaderLazy() {
        System.out.println("Sub Constuctor");
    }
}


class PrintTmp {
    public PrintTmp(String strOut) {
        System.out.println(strOut);
    }
}
SubLoaderLazy test = new SubLoaderLazy();

console

Parent Static Code

Parent Static Member

Sub Static Code

Sub Static Member

Parent Instance Code

Parent Instance Member

Parent Constuctor

Sub Instance Code

Sub Instance Member

Sub Constuctor

 

         另外我们看看下面的代码,说明了静态域先赋default值;然后按顺序赋assign值,先执行tester = new Test(),这时候count1和count2还是0,所以自加后都是1。

         

     private static Test tester = new Test();
     private static int count1;
     private static int count2 = 2;
     public Test() {
         count1++;
         count2++;
         System.out.println("c1=" +count1 + "; c2=" +  count2);
     }

console

c1=1; c2=1

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值