java 类变量初始化顺序

摘要:
创建类对象。如果类未初始化,请先初始化类,然后执行构造函数。具体来说,首先执行类文件中的静态代码块,然后执行构造函数代码块。观察上述类的类文件的静态代码块:可以看出,静态代码块的内容是按顺序收集静态语句,静态变量的赋值也是静态语句。伪代码如下:static{sex=“female”;System.out.println;System.out.pintln;}构造函数代码块:对应的伪代码如下:publicGirl(){<init>name=“anonymous”;age=18;System.out.println;}首先执行<init>方法,即按顺序收集构造函数外部的语句,然后在构造函数内部执行语句。

假定有一个类定义如下:

package com.zhang;

public final class Girl {
    // static代码块1
    private static String sex = "female";
    // 成员方法代码块1
    private String name = "anonymous";
    
    // static代码块2
    static {
        System.out.println("static1");
    }
    
    // 成员方法代码块3
    public Girl() {
        System.out.println("constructor");
    }
    
    // static代码块3
    static {
        System.out.println("static2");
    }
    
    // 成员方法代码块2
    private int age = 18;
}

第一次加载类,并创建该类对象时,静态变量、成员变量的初始化顺序,静态代码的执行顺序是怎样的?

创建一个类对象,如果该类没有初始化,则先初始化该类(执行 clinit 方法),然后执行构造函数(init 方法),具体就是先执行 class 文件中的 static 代码块,然后再执行构造函数代码块。观察上面类的 class 文件 static 代码块:

java 类变量初始化顺序第1张

可以看出,static 代码块内容就是,把 static 语句按顺序搜集起来,static 变量赋值也是 static 语句,伪代码如下:

static {
    sex = "female";
    System.out.println("static1");
    System.out.println("static2");
}

构造函数代码块:

java 类变量初始化顺序第2张

对应的伪代码如下:

public Girl() {
<init> name
= "anonymous"; age = 18; System.out.println("constructor"); }

首先执行 <init> 方法,即按顺序收集构造函数外部的语句,然后再执行构造函数内的语句。

免责声明:文章转载自《java 类变量初始化顺序》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇直连Pixiv的N种姿势——Android,iOS,Mac,Windows&Linux微信公众平台开发尝试下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

好代码是管出来的——.Net Core集成测试与数据驱动测试

  软件的单元测试关注是的软件最小可执行单元是否能够正常执行,但是软件是由一个个最小执行单元组成的集合体,单元与单元之间存在着种种依赖或联系,所以在软件开发时仅仅确保最小单元的正确往往是不够的,为了保证软件能够正确运行,单元与单元之间的集成测试是非常必要。  另外上一篇文章只是介绍了如何使用xUnit.net对.Net Core程序进行简单(无参)的单元测...

C#读写txt文件的方法

1.添加命名空间   System.IO;   System.Text; 2.文件的读取 #region 读取TXT文本文件 /// <summary> /// FileStream读取文本文件 /// </summary> public void FileStre...

C语言32个关键字(2)

二、C语言中的9中控制语句 goto语句:无条件转向; if语句:判断语句; while循环语句; do-while语句:先执行循环体,然后判断循环条件是否成立.之后继续循环; for语句:循环,可替代while语句;只是用法不同; break语句跳出本层的循环;(只跳出包含此语句的循环) continue语句:继续(一般放到循环语句里,不在执行它下面的语...

Shell学习笔记——变量

变量赋值时不需要$符号,且=前后不能有空格 赋值时可以用=`命令`,将命令运行的结果值赋值过去,这里用到的是反引号 $0 $1 $2 - $9表示命令行的参数,并且可以通过shift将后面的参数移到前面来以获得更多参数 read可以读入参数,也可以通过重定向从文件读入,并且最后一个参数会把剩下所有内容读入,不够则为空串。IFS用于设置读取时候的分隔符。 $...

C#访问Java的WebService添加SOAPHeader验证的问题

这两天做与公司OA的接口,发现C#访问Java的WebService需要提供一个SOAP的头验证信息,但是WebService的WSDL中并没有提供约定的验证信息,所以Visual Studio生成的代理类并没有发现这些内容,所以这个SOAPHeader就必须要自己组织,还遇到一个问题就是SOAP头部信息,OA那边还按照不知道什么实例添加了一个根节点没有的...

MFC中UpdateData函数解析

当你使用了ClassWizard(类向导)建立了控件和变量之间的联系后: 当你修改了变量的值,而希望对话框控件更新显示,就应该在修改变量后调用 UpdateData(FALSE); 如果你希望知道用户在对话框中到底输入了什么,就应该在访问变量前调用UpdateData(TRUE)。 用处: 主要控制ddx_data 把控件中的值和变量进行交换。 比如你有个...