Java之static静态代码块

构造代码块

使用{}包裹的代码区域,这里的代码区域特指位于class{}下面的而不是存在于其他type method(){}这类函数下面的代码区域

public class HelloA {
/**
...
*/
{
System.out.println("I'm A construct code block");
} }

构造函数代码块

构造函数代码块指的是构造函数中所包含的代码,类似 className(){}中的代码块

public class HelloA {
public HelloA(){
System.out.println("I'm A construct method code block");
}
}

static代码块

static代码块指的是static{}包裹的代码块,且静态代码只执行一次,可以通过Class.forName("classPath")的方式唤醒代码的static代码块,但是也执行一次。

public class HelloA {
static{
System.out.println("I'm A static code block");
} }

三种代码方式的执行顺序

public class HelloA {
public HelloA(){
System.out.println("I'm A construct method code block");
}
{
System.out.println("I'm A construct code block");
} static {
System.out.println("I'm A static code block");
} public static void main(String[] args) {
new HelloA();
new HelloA(); }
}

result

I'm A static code block

I'm A construct code block

I'm A construct method code block

I'm A construct code block

I'm A construct method code block

可以看到显示static代码初始化,然后是构造方法初始化,然后是构造函数初始化,并且静态代码只会初始化一次。

为什么构造代码块一定在构造函数代码块前执行

这里可以直接代码编译后的文件HelloA.class

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
// public class HelloA {
/*构造代码块直接被内联到了构造函数代码块中*/
public HelloA() {
System.out.println("I'm A construct code block");
System.out.println("I'm A construct method code block");
} public static void main(String[] args) {
new HelloA();
new HelloA();
} static {
System.out.println("I'm A static code block");
}
}

因此得出结论构造代码块直接被内联到构造函数代码块中

并且还可以推论可以直接在构造代码块中调用this或者调用this.method()或者this.staticMethod();

加上继承的情况

public class HelloB extends HelloA {
{
System.out.println("I'm A construct code block");
} public HelloB() {
System.out.println("I'm A construct method code block");
} static {
System.out.println("I'm B static code block");
} public static void main(String[] args) {
new HelloB();
}
}

result

I'm A static code block

I'm B static code block

I'm A construct code block

I'm A construct method code block

I'm A construct code block

I'm A construct method code block

初始化的整体顺序可以渐进的表示为

static > instace

有继承初始化顺序:

另一个静态提升的题见csdn

https://blog.csdn.net/harryptter/article/details/87875399#笔试题

Java之static静态代码块的更多相关文章

  1. Java static 静态代码块、代码块

    简述 static{} 静态代码块,加载类之前执行 {} 代码块,每次new的时候都会被执行 示例 类: public class Student { int age; String name; bo ...

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

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

  3. 关于java构造函数,静态代码块,构造代码块,和普通代码块相关总结(一)

    构造函数.构造代码块和静态代码块容易混淆,它们的执行条件和执行顺序也常常容易犯迷.这里就针对这些问题说一下我个人的一些理解,顺便对这部分内容做个小结. 一.构造函数 格式:类名(参数1,参数2,-){ ...

  4. Java面试题 静态代码块 构造代码块 构造方法 的执行顺序

    JAVA中的静态代码块 构造代码块 构造方法执行顺序: 静态代码块(类加载时执行)>>构造代码块>>构造方法 下面展示一个简单的例子,推荐大家动手运行一遍: public cl ...

  5. static{}静态代码块与{}普通代码块之间的区别

    先看一个例子: //class A package com.my.test; class A { static { System.out.println("A1:父类静态代码区域" ...

  6. Java-静态关键字Static&静态代码块

    静态成员变量:(static修饰变量) 如果一个成员变量使用了static关键字,那么这个变量不再属于对象自己,而是属于所在的类.多个对象共享同一份数据. 静态方法:(static修饰方法) 一旦使用 ...

  7. Java static 静态代码块执行分析

    假设有这样一个类: public class Utils { static { Log.i("static","isLoad!"); } public stat ...

  8. java中,静态代码块static的简单简介

    直接上代码,更直观,包括一些解释: /** * 类初始化时,首先加载静态代码块, * 注意:所有静态代码块都会在方法之前执行,不管放置的位置:但是静态代码块按照顺序执行 * 再次执行调用的方法 */ ...

  9. java中的静态代码块、构造代码块、构造方法

    运行下面这段代码,观察其结果: package com.test; public class HelloB extends HelloA { public HelloB() { } { System. ...

随机推荐

  1. delphi 三层架构简单例子(经测试成功)

    delphi 三层架构简单例子(经测试成功) 转载 2013年12月19日 09:48:57 1100 所谓三层: (1) 客户端 (2) 服务器端 (3) 数据库 在数据访问时,使得客户端必须通过服 ...

  2. PHP获取页面执行时间的方法(推荐)

    一些循环代码,有时候要知道页面执行的时间,可以添加以下几行代码到页面头部和尾部: 头部:$stime=microtime(true); 尾部: $etime=microtime(true);//获取程 ...

  3. MyBatis 与 Hibernate对比

  4. quartz的配置文件

    quartz在运行时默认加载的是工程目录下的quartz.properties文件,如果工程目录下没有quartz.properties文件,它就会去读取quartz jar包下的quartz.pro ...

  5. MySQL数据库篇之索引原理与慢查询优化之二

    接上篇 7️⃣  正确使用索引 一.索引未命中 并不是说我们创建了索引就一定会加快查询速度,若想利用索引达到预想的提高查询速度的效果, 我们在添加索引时,必须遵循以下问题: #1 范围问题,或者说条件 ...

  6. 混合开发Js bridge新秀-DSBridge iOS篇

    这个DSBridge 和我之前开发做的混合开发 用的方式 很相似,所以觉得很是不错,推荐给你大家. DSBridge-IOS:https://github.com/wendux/DSBridge-IO ...

  7. CF 438E The Child and Binary Tree

    BZOJ 3625 吐槽 BZOJ上至今没有卡过去,太慢了卡得我不敢交了…… 一件很奇怪的事情就是不管是本地还是自己上传数据到OJ测试都远远没有到达时限. 本题做法 设$f_i$表示权值为$i$的二叉 ...

  8. Notepad++ xml/json格式化

    Xml格式化: 1. 安装XML Tools插件 (1) 通过网址http://sourceforge.net/projects/npp-plugins/files/XML%20Tools/下载XML ...

  9. HUST软测1504班第6周小组作业成绩

    说明 本次公布的成绩为第6周小组作业的结果: 第6周小组作业:WordCount(详情见毕博平台) 如果同学对作业结果存在异议,可以: 在毕博平台讨论区的第6周作业第在线答疑区发帖申诉. 或直接在博客 ...

  10. query.validate.js使用说明+中文API

    转自:http://www.cnblogs.com/hejunrex/archive/2011/11/17/2252193.html 看到一篇好的文章不容易,记录下来以防丢失! 官网地址:http:/ ...