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. Windows下DOS命令大全(经典收藏)

    copy \\ip\admin$\svv.exe c:\ 或:copy\\ip\admin$\*.* 复制对方admini$共享下的srv.exe文件(所有文件)至本地C: xcopy 要复制的文件或 ...

  2. a different object with the same identifier value was already associated with the session解决方案

    org.springframework.orm.hibernate3.HibernateSystemException: a different ]; nested exception ] at or ...

  3. 从0开始用spring boot编写分布式配置中心-peppa

    欢迎大家一起来编写peppa github地址: github 交流群: 目前市面上比较流行的分布式配置中心有disconf.apollo,用起来还是比较方便的,然而由于在权限管理这块做得不够好,导致 ...

  4. go_函数

    函数语法要点 返回值类型写在最后面 可返回多个值 函数可作为参数 没有默认参数,可选参数,只有可变参数列表(...int) package main import ( "fmt" ...

  5. NPC问题及其解决方法(回溯法、动态规划、贪心法、深度优先遍历)

    NP问题(Non-deterministic Polynomial ):多项式复杂程度的非确定性问题,这些问题无法根据公式直接地计算出来.比如,找大质数的问题(有没有一个公式,你一套公式,就可以一步步 ...

  6. 无法查找或打开 PDB 文件解决办法

    用VS调试程序时,有时会在VS底部的“输出”框中提示“无法查找或打开 PDB 文件”.这该怎么解决呢? 下面,我们以VS2013为例,来教大家解决办法. 工具/原料 VS 方法/步骤   打开VS20 ...

  7. jquery设置select选中的文本

    <select id="prov">  <option value="1">北京市</option>  <option ...

  8. 使用BBED理解和修改Oracle数据块

    1.生成bbed list file文件: SQL> select file#||' '||name||' '||bytes from v$datafile; $ vim dbfile.txt ...

  9. mvc中使用Hangfire处理后台任务

    考虑下如下代码,在数据保存后,需要发送邮件,发送邮件是个耗时的工作. 我们的目的是,数据保存成功后,就可以返回响应了,发送邮件不重要,不需要等待邮件发送成功 [HttpPost] public Act ...

  10. javascript总结31 :DOM概述

    1 JavaScript 三个组成部分 核心(ECMAScript)欧洲计算机制造商协会 描述了JS的语法和基本对象. 文档对象模型(DOM) 处理网页内容的方法和接口 浏览器对象模型(BOM) 与浏 ...