假定有一个类定义如下:

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 代码块:

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

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

构造函数代码块:

对应的伪代码如下:

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

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

java 类变量初始化顺序的更多相关文章

  1. Java变量、Java对象初始化顺序

    局部变量与成员变量: 局部变量分为: 行参:在方法签名中定义的局部变量,随方法的结束而凋亡. 方法内的局部变量:必须在方法内对其显示初始化,从初始化后开始生效,随方法的结束而凋亡. 代码块内的局部变量 ...

  2. Java提高篇——静态代码块、构造代码块、构造函数以及Java类初始化顺序

    静态代码块:用staitc声明,jvm加载类时执行,仅执行一次构造代码块:类中直接用{}定义,每一次创建对象时执行.执行顺序优先级:静态块,main(),构造块,构造方法. 构造函数 public H ...

  3. JAVA的初始化顺序:

    JAVA的初始化顺序: 父类的静态成员初始化>父类的静态代码块>子类的静态成员初始化>子类的静态代码块>父类的代码块>父类的构造方法>子类的代码块>子类的构造 ...

  4. java 继承 初始化顺序

    面向对象三大特性: 封装,继承,多态 java 继承初始化顺序 先初始化父类对象, 在父类对象中先初始化父类属性,再初始化父类的构造方法,然后初始化子类对象,初始化子类对象的属性,初始化子类的构造方法 ...

  5. 【知识总结】Java类初始化顺序说明

    微信公众号:努力编程的小猪如有问题或建议,请公众号留言 Java类初始化顺序说明 一个类中包含如下几类东西,他们前后是有顺序关系的 静态属性:static 开头定义的属性 静态方法块: static ...

  6. java继承 初始化顺序

    java继承 初始化顺序 标签: 初始化顺序 2013-08-01 10:13 879人阅读 评论(0) 收藏 举报  分类: java(8)  版权声明:本文为博主原创文章,未经博主允许不得转载. ...

  7. Java对象初始化顺序

    最近我发现了一个有趣的问题,这个问题的答案乍一看下骗过了我的眼睛.看一下这三个类: package com.ds.test;   public class Upper { String upperSt ...

  8. Android(java)学习笔记136:Java类初始化顺序

    Java类中初试化的顺序: 由此得出Java普通类初始化顺序结论: 静态变量 静态初始化块 变量 初始化块 构造器 由此得出Java继承类初始化顺序结论:     1 .继承体系的所有静态成员初始化( ...

  9. 【细说Java】Java变量初始化顺序

    Java的变量初始化顺序,对这里一直似懂非懂,面试的时候也经常被问到,但答的一直不好,现在整理记录一下,以后忘记了可以来看看. 程序分为两个部分,第一个部分不考虑继承,第二个部分考虑继承: (1)不考 ...

随机推荐

  1. ege demo

    #include <ege.h> const float base_speed = 0.5f; const float randspeed = 1.5f; //自定义函数,用来返回一个0 ...

  2. 使用lombok 找不到方法

    在setting里面查找并设置就好了

  3. django模型表单ModelForm

    如果你正在构建一个数据库驱动的应用,那么你可能会有与Django的模型紧密映射的表单.比如,你有个BlogComment模型,并且你还想创建一个表单让大家提交评论到这个模型中.在这种情况下,写一个fo ...

  4. Qt5.WebView.添加节点的测试代码

    1.代码: #include "mainwindow.h" #include "ui_mainwindow.h" #include <QWebFrame& ...

  5. AFM(3)---Maude使用说明

    load file-name 1可用绝对路径 2.可进入maude文件所在目录下load 3.默认工作空间是什么?

  6. Activity回传值报错:Failure delivering result ResultInfo{who=null,request=7,result = 0,data=null}

    Activity  A   -----值------->  Activity  B   -----值----->  Activity  A     场景:当A跳转到B,再从B直接点击返回按 ...

  7. Android 虹软免费人脸识别App

    人脸识别+本机Web后端 人脸sdk采用虹软sdk,本机web采用AndServer:上传姓名+人脸图片即可实现注册源码地址:https://github.com/joetang1989/ArcFac ...

  8. 单调队列 Monotonic Queue / 单调栈 Monotonic Stack

    2018-11-16 22:45:48 一.单调队列 Monotone Queue 239. Sliding Window Maximum 问题描述: 问题求解: 本题是一个经典的可以使用双端队列或者 ...

  9. Java将byte[]和int的互相转换

    /** * 将整数转换为byte数组并指定长度 * @param a 整数 * @param length 指定长度 * @return */ public static byte[] intToBy ...

  10. python+opencv 运行环境搭建

    1:安装pycharm,验证码你懂的 2:安装python3.5以上,或3.6,python2和3 的版本差异还蛮大 3:安装opencv,如下图 以上是方法一,还有之中方法是下载whl文件再手动安装 ...