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. ...
随机推荐
- hibernate nhibernate sqlserver数据库的默认值冲突解决
数据库中一个字段的默认值设为0,当用hibernate插入数据时,没有对该字段进行操作,结果该字段居然不是0,而是空.后来google了一下,发现应该在.hbm.xml文件中添加一些参数定义(示例中的 ...
- 从零开始搭建k8s-20180301
yum install -y yum-utils git etcd yum-config-manager --add-repo https://download.docker.com/linux/ce ...
- 【bzoj2242】[SDOI2011]计算器
2242: [SDOI2011]计算器 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 3207 Solved: 1258[Submit][Statu ...
- OceanBase
OceanBase 编辑 本词条缺少名片图,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧! OceanBase是一个支持海量数据的高性能分布式数据库系统,实现了 数千亿条记录.数百TB数据上的 ...
- CloudStack tomcat集成方式分析
CloudStack 的server.xml和tomcat6.conf都是软连接 CloudStack 在执行脚本时报异常如下: 修改vim /etc/sudoers文件,具体如下 以 ...
- Java 8特性
1. Java8的新特性 1.1. Lambda表达式和函数式接口 最简单的Lambda表达式可以用逗号分隔的参数列表.->符号和功能语句块来表示.示例如下: Arrays.asList( &q ...
- echo $[1 + 2] shell中 $[] 在bash中同$(()),用于算术计算
shell脚本编写:echo $[ 11#8+1] 输出结果是几,为什么,怎么算来的? 摘自:https://zhidao.baidu.com/question/334766451.html 结 ...
- 没有Reduce的MapReduce(一)
尝试了一个没有Reduce的MapReduce. [应用场景]: 从Hbase的A表中进行数据抽样,直接输出到B表中. 这种场景下,相当于只进行了一个数据检索,本来是用Hive就可以实现,但是考虑到业 ...
- SQL Server数据库大型应用解决方案总结(转)
出处:http://tech.it168.com/a2012/0110/1300/000001300144.shtml [IT168 技术]随着互联网应用的广泛普及,海量数据的存储和访问成为了系统设计 ...
- 使用word 2007 发布csdn博客
目前大部分的博客作者在写博客这件事情上都会遇到以下3个痛点:1.所有博客平台关闭了文档发布接口,用户无法使用Word,Windows Live Writer等工具来发布博客.2.发布到博客或公众号平台 ...