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#笔试题
Java之static静态代码块的更多相关文章
- Java static 静态代码块、代码块
简述 static{} 静态代码块,加载类之前执行 {} 代码块,每次new的时候都会被执行 示例 类: public class Student { int age; String name; bo ...
- Java提高篇——静态代码块、构造代码块、构造函数以及Java类初始化顺序
静态代码块:用staitc声明,jvm加载类时执行,仅执行一次构造代码块:类中直接用{}定义,每一次创建对象时执行.执行顺序优先级:静态块,main(),构造块,构造方法. 构造函数 public H ...
- 关于java构造函数,静态代码块,构造代码块,和普通代码块相关总结(一)
构造函数.构造代码块和静态代码块容易混淆,它们的执行条件和执行顺序也常常容易犯迷.这里就针对这些问题说一下我个人的一些理解,顺便对这部分内容做个小结. 一.构造函数 格式:类名(参数1,参数2,-){ ...
- Java面试题 静态代码块 构造代码块 构造方法 的执行顺序
JAVA中的静态代码块 构造代码块 构造方法执行顺序: 静态代码块(类加载时执行)>>构造代码块>>构造方法 下面展示一个简单的例子,推荐大家动手运行一遍: public cl ...
- static{}静态代码块与{}普通代码块之间的区别
先看一个例子: //class A package com.my.test; class A { static { System.out.println("A1:父类静态代码区域" ...
- Java-静态关键字Static&静态代码块
静态成员变量:(static修饰变量) 如果一个成员变量使用了static关键字,那么这个变量不再属于对象自己,而是属于所在的类.多个对象共享同一份数据. 静态方法:(static修饰方法) 一旦使用 ...
- Java static 静态代码块执行分析
假设有这样一个类: public class Utils { static { Log.i("static","isLoad!"); } public stat ...
- java中,静态代码块static的简单简介
直接上代码,更直观,包括一些解释: /** * 类初始化时,首先加载静态代码块, * 注意:所有静态代码块都会在方法之前执行,不管放置的位置:但是静态代码块按照顺序执行 * 再次执行调用的方法 */ ...
- java中的静态代码块、构造代码块、构造方法
运行下面这段代码,观察其结果: package com.test; public class HelloB extends HelloA { public HelloB() { } { System. ...
随机推荐
- axis2 webService开发指南(1)
参考文件:blog.csdn.net/IBM_hoojo http://hoojo.cnblogs.com/ 1 WebService简介 WebService让一个程序可以透明的调用互联网的程序,不 ...
- lucene3.0范围查找
在lucene3.0以上版本中,范围查询也有很大的变化,RangeQuery已经不推荐使用,使用TermRangeQuery和NumericRangeQuery两个替代.TermRangeQuery: ...
- javascript的Undefined,null区别
//在javascript中null表示“什么都没有” ,是一个特殊的类型,表示一个空对象引用: var person = null; //值为null(空),但类型为对象 console.log(p ...
- c++对象模型是什么,对象的内存布局和结构问题
在c++发明的初期对于c++对象模型的争论从来没有停止过直到标准委员会通过了最终的c++对象模型这件事情才变得尘埃落定.C++对象模型可能是最不需要去解释的,但是又是不得不去说的因为c++的入门最先接 ...
- 2018年最新 Java面试通关要点汇总集
基础篇 基本功 面向对象的特征 final, finally, finalize 的区别 int 和 Integer 有什么区别 重载和重写的区别 抽象类和接口有什么区别 说说反射的用途及实现 说说自 ...
- TFS(Visual Studio Team Services) git认证失败 authentication fails 的解决方案
问题描述 TFS 在visual studio中使用正常,可是git pull运行失败,提示 authentication fails. 初步判断原因为默认的 credential.helper 与 ...
- RAW编程接口
LWIP移植好之后,就要使用它提供的API接口来编写程序.
- Sprig 面试中 问及 DI,IOC, AOP
面向切面编程,把散落在程序中的公共部分提取出来,做成切面类,这样的好处在于,代码的可重用,一旦涉及到该功能的需求发生变化,只要修改该代码就行,否则,你要到处修改,如果只要修改1.2处那还可以接受,万一 ...
- [GO]结构体成员的使用:指针变量
package main import "fmt" func main() { type student struct { id int name string sex byte ...
- WordPaster2-Chrome 45安装说明
下载地址:http://www.ncmem.com/download/WordPaster2/WordPaster.exe 安装方法: 运行WordPaster.exe进行安装,WordPaste ...