Java中的代码块
为方便清晰地掌握, 分开为概念和执行顺序两部分.
先了解它们具体是什么, 然后再探究它们的执行顺序.
概念
代码块: 定义在{}内部的代码.
普通代码块:
定义在方法里的代码块.
定义在普通方法中的{}就是最普通的代码块.
例如:
public static void main(String[] args){
{
System.out.println("--------方法中的普通代码块-------");
}
}
复制代码
静态代码块:
定义在static里的代码块.
通常会在普通代码块的基础上在前面加上一个static, 来区分于普通的代码块.
并且, 它是属于类的. 不在方法里边.
例如:
public class Person{
static {
System.out.println("--------static中的静态代码块-------");
}
}
复制代码
构造块:
起名叫构造块的原因: 定义在类中而不是方法中, 并且执行上也有特点, 每次只在构造函数被调用时才会被执行.
与前面的区别在于, 一是在类中(与普通代码块相比), 二, 没有static的关键字.
定义在类中的代码块.
其实, 构造块还有一个名字叫做初始化块.
例如:
public class Person{
{
System.out.println("--------类中的构造代码块-------");
}
}
复制代码
执行顺序
在了解了以上3中代码块的概念之后, 让我们来看看它们在执行时间执行顺序上分别是怎样的.
例子: 在一个类中会依次写以上三种代码块, 来查看执行顺序.
其中, 为保证构造代码块的使用, 在main方法中会调用构造函数.
Demo
/**
* Content:
* 三种代码块
* @version 2020/4/22
* written by Jonty Zheng
*/
public class CodeBlockTest{
static int x = 1;
//类中的代码块
{
System.out.println("--------1.构造代码块分隔线-------");
}
//main方法
public static void main(String[] args){
System.out.println("--------main方法--------");
//方法中的普通代码块
{
System.out.println("--------2.普通代码块分隔线-------");
}
//调用构造方法
CodeBlockTest sbe = new CodeBlockTest();
}
//static中的代码块
static {
System.out.println("--------3.静态代码块分割线--------");
}
复制代码
程序的简单分析:
通过demo, 可以看到, 程序从上到下, 依次, 先是在构造函数的位置, 写了一个1.构造代码块分隔线, 接着在main方法中写了一个2.普通的代码块, 在前面加了一条方法的标识线. 并在后面追加了一个3.静态代码块.
接着来让我们看看程序是否会像顺序流一样, 依次执行1,2,3的代码块.
程序运行:
图1
--------3.静态代码块分割线--------
--------main方法--------
--------2.普通代码块分隔线-------
--------1.构造代码块分隔线-------
复制代码
运行分析:
可以看到的是
与代码看上去的顺序大相径庭:
在后面的static静态代码块会优先执行, 与它的位置无关, 即使它长在main方法中的下方, 这说明在所有的代码块中静态代码块是优先执行, 地位还是比较高的(伴随着类加载的时候它就出来了).
接着就是很常规的执行顺序了, 按照程序的代码位置顺序, 原先就是写在main方法普通代码块后面的构造函数, 在实际运行时也是在普通代码块后执行
构造块当且仅当构造函数执行后才会被执行.
扩展
尝试了如果重写构造函数呢, 既然构造代码块是在构造函数被调用的时候被执行的, 那么, 构造函数和构造块两者之间又会不会有执行顺序上的先后呢?
程序修改: 将以下内容(构造函数中打印输出)加入到了原Demo构造块上的位置.
//我加在构造块的前边
public CodeBlockTest(){
System.out.println("测试构造函数");
}
复制代码
程序运行:
图2
--------3.静态代码块分割线--------
--------main方法--------
--------2.普通代码块分隔线-------
--------1.构造代码块分隔线-------
测试构造函数
复制代码
运行分析:
可以看到的是, 构造函数写在前. 但实际上,
却行在后的.
小结:
通过以上的测试, 三大代码块的特征和执行顺序可以概括为以下2点.
1.执行顺序: static静态块 > 普通代码块 构造块
2.构造块只有在构造函数new时才会执行, 且实际顺序上优先构造函数.
以上皆与代码顺序无关.