zoukankan      html  css  js  c++  java
  • clinit和init(转载) 规格严格

    今天在看深入Java虚拟机的class文件结构时,看到了这么一句话,

    可能出现在class文件中的两种编译器产生的方法是:实例初始化方法(名为<init>)和类与接口初始化方法(名为<clinit>)。

    这两种方法有什么区别呢?

    首先:这两个方法一个是虚拟机在装载一个类初始化的时候调用的(clinit)。另一个是在类实例化时调用的(init)

    首先说说类的初始化:

    在Java代码中,一个正确的初始值是通过类变量初始化语句或者静态初始化语句给出的。一个类变量初始化语句是

    变量声明后的等号和表达式:

    Java代码 复制代码
    1. class Example {   
    2.        static int size = 3 * (int) (Math.random() * 5.0);   
    3. }  

    静态初始化语句是一个以static开头的语句块:

    Java代码 复制代码
    1. class Example{   
    2.      static int size;   
    3.      static {   
    4.            size = 3 * (int) (Math.random() * 5.0);   
    5.      }   
    6. }  

     所有的类变量初始化语句和类型的静态初始化语句都被Java编译器收集到了一起,放在一个特殊的方法中。这个方法就是<clinit>

    我们在来看看<init>这个方法:

    <init>方法是在一个类进行对象实例化时调用的。实例化一个类有四种途径:调用new操作符;调用Class或java.lang.reflect.Constructor对象的newInstance()方法;调用任何现有对象的clone()方法;通过java.io.ObjectInputStream类的getObject()方法反序列化。

    Java编译器会为它的每一个类都至少生成一个实例初始化方法。在Class文件中,被称为"<init>"

    现在知道了吧, 一个是用于初始化静态的类变量, 一个是初始化实例变量!

  • 相关阅读:
    Azure 虚拟机安全加固整理
    AzureARM 使用 powershell 扩容系统磁盘大小
    Azure Linux 云主机使用Root超级用户登录
    Open edX 配置 O365 SMTP
    powershell 根据错误GUID查寻错误详情
    azure 创建redhat镜像帮助
    Azure Powershell blob中指定的vhd创建虚拟机
    Azure Powershell 获取可用镜像 PublisherName,Offer,Skus,Version
    Power BI 连接到 Azure 账单,自动生成报表,可刷新
    Azure powershell 获取 vmSize 可用列表的命令
  • 原文地址:https://www.cnblogs.com/diyunpeng/p/1775200.html
Copyright © 2011-2022 走看看