初始化与clinit在Java中有什么不同

  介绍

今天就跟大家聊聊有关init与clinit在Java中有什么不同,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

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

init(或>类X {   静态日志日志=LogFactory.getLog ();//& lt; clinit>   私人int x=1;//& lt; init>   X () {//& lt; init>   }   静态{//& lt; clinit>   }   }

在准备阶段,变量已经赋过一次系统要求的初始值,而在初始化阶段,则根据程序员通过程序制定的主观计划去初始化类变量和其他资源,或者可以从另外一个角度来表达:初始化阶段是执行类构造器()方法的过程。

()方法是由编译器自动收集类中的所有类变量的赋值动作和静态语句块(静态{}块)中的语句合并产生的,编译器收集的顺序是由语句在源文件中出现的顺序所决定的,静态语句块中只能访问到定义在静态语句块之前的变量,定义在它之后的变量,在前面的静态语句块可以赋值,但是不能访问如下代码

{公共类测试
  静态{
  我=0;//给变量赋值可以正常编译通过
  System.out.print (i);//这句编译器会提示“非法向前引用“;
  }
  静态int i=1;
  }

②虚拟机会保证在子类的()方法执行之前,父类的()方法已经执行完毕。因此在虚拟机中第一个被执行的()方法的类肯定是. lang。对象。由于父类的()方法先执行,也就意味着父类中定义的静态语句块要优先于子类的变量赋值操作,如下代码中,字段B的值将会是2而不是1 .

静态类父母{
  公共静态int=1;
  静态{=2;}
  静态类子父{延伸
  公共静态int B=;
  }
  公共静态void main (String [] args) {
  System.out.println (Sub.B);
  }
  }

③接口中不能使用静态语句块,但仍然有变量初始化的赋值操作,因此接口与类一样都会生成()方法。但接口与类不同的是,执行接口的()方法不需要先执行父接口的()方法。只有当父接口中定义的变量使用时,父接口才会初始化。另外,接口的实现类在初始化时也一样不会执行接口的()方法。

看完上述内容,你们对init与clinit在Java中有什么不同有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注行业资讯频道,感谢大家的支持。

初始化与clinit在Java中有什么不同