• java 的init方法与clinit方法


        jvm加载过程 加载=》验证=》准备=》解析=》初始化=》使用=》卸载

         一   clinit初始化/静态方法 

     类型初始化方法主要是对static变量进行初始化操作,对static域和static代码块初始化的逻辑全部封装在<clinit>方法中。

        java.lang.Class.forName(String name, boolean initialize,ClassLoader loader),其中第二个参数就是是否需要初始化。

    Java类型初始化过程中对static变量的初始化操作依赖于static域和static代码块的前后关系,
    static域与static代码块声明的位置关系会导致java编译器生成<clinit>方法字节码。
    类型的初始化方法<clinit>只在该类型被加载时才执行,且只执行一次。

    二 对象实例化方法<init>

    Java对象在被创建时,会进行实例化操作。该部分操作封装在<init>方法中,并且子类的<init>方法中会首先对父类<init>方法的调用。
    Java对象实例化过程中对实例域的初始化赋值操作全部在<init>方法中进行,<init>方法显式的调用父类的<init>方法,
    实例域的声明以及实例初始化语句块同样的位置关系会影响编译器生成的<init>方法的字节码顺序,<init>方法以构造方法作为结束。

        三    init和clinit区别:

        

    ①init和clinit方法执行时机不同

        init是对象构造器方法,也就是说在程序执行 new 一个对象调用该对象类的 constructor 方法时才会执行init方法,而clinit是类构造器方法,也就是在jvm进行类加载—–验证—-解析—–初始化,中的初始化阶段jvm会调用clinit方法。


    ②init和clinit方法执行目的不同

    init is the (or one of the) constructor(s) for the instance, and non-static field initialization. 
    clinit are the static initialization blocks for the class, and static field initialization. 
    上面这两句是Stack Overflow上的解析,很清楚init是instance实例构造器,对非静态变量解析初始化,而clinit是class类构造器对静态变量,静态代码块进行初始化。看看下面的这段程序就很清楚了。

    class X {
     
       static Log log = LogFactory.getLog(); // <clinit>
     
       private int x = 1;   // <init>
     
       X(){
          // <init>
       }
    {
    // <init>
    }
    static { // <clinit> } }

      clinit一定优先于init

    附送一个构造代码块和静态代码块的比较 https://www.cnblogs.com/ysocean/p/8194428.html

  • 相关阅读:
    手机游戏怎么独占世界手游鳌头
    游戏开发商是如何做到每日进帐410万美元的?
    [手游新项目历程]-48-svn分支开发与主干合并
    三国武将所带兵种
    Supercell:靠两款手游如何做到30亿美金市值?
    理财投资这需要知道的50个真相
    [手游新项目历程]-49-性能分析
    [手游新项目历程]-50-Mysql的大字段问题(数据库执行错误: Error=1118, Reason=Row size too large (> 8126))
    三国杀
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
  • 原文地址:https://www.cnblogs.com/funkboy/p/12061226.html
Copyright © 2020-2023  润新知