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. JSON 新感

    1,如何解析复杂JSON 选择fastJson 用起来简单方便,前提必须是标准的JSON: 例子: paraArray = "[" + paraArray + "]&qu ...

  2. 配置siebel捕捉SQL语句

    C:\Siebel\15.0.0.0.0\Client\BIN\siebel.exe /c c:\Siebel\15.0.0.0.0\Client\bin\chs\siebel.cfg /B &quo ...

  3. Mac shell使用技巧总结(转)

    1.文件操作 常用目录 /Systme/Library/Extensions // 驱动所在目录 /User/XXX/Desktop // 桌面目录 资源库 chflags nohidden ~/Li ...

  4. 磁盘io测试工具

    1. ATTO Disk Benchmark 2.DiskSpd磁盘性能测试工具

  5. SQL Server 2005/2008/2012中应用分布式分区视图

    自2000版本起,SQL Server企业版中引入分布式分区视图,允许你为分布在不同的SQL 实例的两个或多个水平分区表创建视图. 简要步骤如下:根据Check约束中定义的一组值把大表分割成更小的一些 ...

  6. 魔法变量*args 和 **kwargs

    其实并不是必须写成*args 和**kwargs. 只有变量前面的 *(星号)才是必须的. 你也可以写成*var 和**vars. 而写成*args 和**kwargs只是一个通俗的命名约定. *ar ...

  7. 原型设计工具Mockplus新年送福利,见者有份

    为感谢大家对Mockplus的喜爱与支持,给大家送福利了! 送送送,见者有份! 参与活动,三分钟时间,均可最高获赠专业版1个月使用时间.见者有份! 领福利步骤: 1. 扫码关注微信公众号:Mockpl ...

  8. Oracle VirtualBox 问题汇总

    1.打开虚拟机时报硬盘UUID 已经存在:错误信息: Cannot register the hard disk 'F:\VirtualBox VMs\cl-11r2-rac2\cl-11r2-rac ...

  9. position与offset的区别

    .offset()是相对于文档(document)的当前位置,.position()是相对于父级元素的位移,一个元素可以嵌套多个position

  10. Qcreator3.1.2调试器(windows)版本

    环境:visual studio 2012 qt:5.3.1 默认的ms版本qtcreator只能使用visual studio的编译器,不能使用调试工具.需要gdb或者cdb进行调试,这里介绍使用的 ...