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. ...
随机推荐
- GL_LINES & GL_LINE_STRIP & GL_LINE_LOOP
[GL_LINES] 独立的线段,下式中,p2与p3间没有连线. [GL_LINE_STRIP] 连续的线段,下式中, p2与p3会连成线段. [GL_LINE_LOOP] 参考:<计算机图形学 ...
- Inversions SGU - 180
这个是逆序对的裸题哇 归并排序或者树状数组~ 树状数组的话需要离散化一下··· emm确实很水很水很水··· 归并排序: #include <cstdio> #include <al ...
- 【Unity】Collider随骨骼动画运动
Collider位置和角色的动作不一致会导致Mesh互相镶嵌,让游戏失真. 想象一扇门的Collider没随它打开的动画移动,结果就是你看着门开着却穿不过去. 而我遇到的情况是: 角色在执行跑 ...
- Unity3d收藏链接/ 小马哥视频
Unity3d视频教程下载链接: http://pan.baidu.com/s/1kVwFhrh 密码: v6c7 第一部分 https://pan.baidu.com/share/in ...
- Mask_RCNN训练自己的模型(练习)
- module 'tensorflow.contrib.rnn' has no attribute 'core_rnn_cell'
#tf.contrib.rnn.core_rnn_cell.BasicLSTMCell(lstm_size) tf.contrib.rnn.BasicLSTMCell(lstm_size)
- Qt webkitwidgets模块和webenginewidgets模块
问题 将Qt开发的程序从Qt5.5或更低的版本迁移到5.6或更高的版本时,会提示webkitwidgets是unknown module. Project ERROR: Unknown module( ...
- HTTP 499状态码 nginx下499错误详解-乾颐堂
日志记录中HTTP状态码出现499错误有多种情况,我遇到的一种情况是nginx反代到一个永远打不开的后端,就这样了,日志状态记录是499.发送字节数是0. 老是有用户反映网站系统时好时坏,因为线上的产 ...
- Spring.net 后处理器 可用来切换实例
.xml配置 <!--我们在Object.xml文件上将HexuObjectPostProcessor注册到上下文对象中去--> <object id="hexu" ...
- STM32F4通用定时器
1.基本原理 三种定时器区别 通用定时器功能特点描述 在这里只用输入捕获事件也能获取脉冲个数同时可以只使用它来获取脉冲宽度,比如当捕获到上升沿,马上进入中断,把计数器的值置零,然后等待捕获下降沿的到来 ...