java类的加载时机

研究问题:

  1. 构造方法,成员变量的初始化,多态构造函数调用时机?

要点:
  • java 构造函数 成员函数初始化顺序 以及多态的构造函数的调用顺序
    http://blog.csdn.net/zhanghaotian2011/article/details/9040935
  • class文件中先执行main方法外部静态代码块,再按照顺序依次执行其他代码块(构造代码块、局部代码块),main方法中类实例化对象时,它并不是首先调用其构造方法而是先是变量的初始化,而且成员的初始化的顺序以成员变量的定义顺序有关,先定义的先初始化,初始化后再调用构造方法。其实成员变量的初始化,在类的所有方法调用之前进行,包括构造方法。
    注意:static 的成员比普通的成员变量先初始化。
  • ———————————————–混混哥—————————————————-
    类初始化的时机,有且仅有四个:
    1、遇到new、getstatic、putstatic、invokestatic这四条字节码指令的时候。
    2、使用Java.lang.reflect进行反射调用的时候。
    3、当初始化一个类的时候,发现其父类还没有初始化,那么先去初始化它的父类。
    4、当虚拟机启动的时候,需要初始化main函数所在的类。

    ———————————————-友谊哥———————————————–
      说到这里,还要说下,静态变量和静态初始化块,普通变量、普通初始化块之间的初始化顺序。看这里
      链接中说明了,静态变量和静态初始化块的声明顺序决定了初始化的顺序。
      静态变量和静态初始化块的初始化时间::早于::普通变量和普通初始化块::早于::构造方法。
      并不是完全父类初始化完毕之后,子类才开始初始化。实际上子类的静态变量和静态初始化块的初始化是在父类的变量、初始化块和构造器初始化之前就完成了。


截图展示区:
  1. 1.
class Test01{
    public Test01(int i){
        System.out.println("Test01 of constractor : " + i);
    }
}
public class Test02{
    private Test01 t1 = new Test01(1);
    private int n = 10;

    public Test02(){
        System.out.println("Test02 of constructor : " + n);
    }
    private Test01 t2 = new Test01(2);
    public static void main(String[] args){
        Test02 test = new Test02();
    }

}

运行结果:
这里写图片描述
2.

public class Test03{
    private int i1 = printCommon();
    private static int i2 = printStatic();

    public Test03(){

    }
    public static int printCommon(){
        System.out.println("i1 is init!");
        return 1;
    }
    public static int printStatic(){
        System.out.println("i2 is init!");
        return 2;
    }
    public static void main(String[] args){
        Test03 t = new Test03();
    }
}

运行结果:
这里写图片描述

  1. 3.
public class Test04{
    private static Test04 t1 = new Test04();
    private static int i1;
    private static int i2 = 2;

    public Test04(){
        i1++;
        i2++;
    }

    public static void main(String[] args){
        Test04 t2 = new Test04();
        System.out.println("t2.i1 = " + t2.i1);
        System.out.println("t2.i2 = " + t2.i2);
    }
}

运行结果:
这里写图片描述
4.
这里写图片描述
在类初始化的时候,就规定了,静态语句块中只能访问到定义在静态语句块之前的变量,定义在它之后的,只能赋值,不能访问。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值