<clinit>与<init>方法

<clinit>方法的执行时期:类初始化阶段

<clinit>方法的内容:多有的类变量初始化语句和类型的静态初始化器

类的初始化的时机:在java代码中首次主动使用的时候,

1、创建某个类的新实例的时候,

2、调用某个类的静态方法时

3、使用某个类或者接口的静态字段或者对改字段(final 字段除外)赋值的时候

4、调用java的某些反射方法的时候

5、初始化某个类的子类的时候

6、在虚拟机启动的时候某个含有main()方法的那个启动类

不会有<client>方法的情况

1、各类没有申明任何的类变量,也没有静态初始化语句

2、该类声明了类变量,但没有明确使用类变量的初始化语句或者静态初始化语句的初始化

3、该类仅仅包干final修饰的类变量初始化语句,并且类变量初始化语句是便是时常量表达式

<init>方法:

执行时期:对象的初始化阶段

实例化一个类的途径:

1、调用new操作符

2、调用Class 或 java.lang.reflect.Constructor 对象的newInstance()方法

3、调用任何现有方法的clone方法

4、通过 java.io.ObjectInputStream 类的 getObject() 方法反序列化

类加载:

类加载的时机:

1、遇到new、getstatic、putstatic活invokestatic这4条字节码指令的时候,如果类没有进行过初始化,则需要先触发器初始化。

2、使用java.lang.reflect包的方法对类进行反射调用的时候,如果类没有进行过初始化,则需要先触发其初始化

3、当初始化一个类的时候,如果发现其父类还没有进行初始化,则需要先出发其父类的初始化

4、当虚拟机启动的时候,用户需要制定一个要执行的主类(包含main()方法的那个类),虚拟机会先初始化这个类

5、当时用JDK1.7动态语言支持的时候,如果一个java.lang.invoke.MethodHandle实例最后的解析结果REF_getStatic、REF_putStatic,REF_invokeStatic的方法句柄,并且这个方法句柄所对应的类没有进行过初始化,组需要先触发其初始化

对于静态字段,只有直接定义这个字段的类才会被初始化,因此通子类来引用父类中定义的静态字段,只会出发父类的初始化,而不会触发子类的初始化。

卸载

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值