Java之static静态代码块
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#%e7%ac%94%e8%af%95%e9%a2%98
推荐阅读
-
java实战技巧之if-else代码优化技巧大全
-
java 代码块与静态代码块加载顺序
-
Java 代码检查工具之PMD入门使用详细教程
-
13_Java面向对象_第13天(static、final、匿名对象、内部类、包、修饰符、代码块)_讲义
-
java基础 静态 static 问在多态中,子类静态方法覆盖父类静态方法时,父类引用调用的是哪个方法?
-
Python 入门之代码块、小数据池 与 深浅拷贝
-
Java代码质量改进之:同步对象的选择
-
JAVA-this关键字JAVAsuper关键字JAVA-static修饰符和final以代码块内部类和枚举
-
static关键字、代码块、数组容器
-
Java和Android中,代码块、static静态代码块的执行顺序