在程序编写之中可以直接使用“{}”定义一段语句,那么根据此部分定义的位置以及声明的关键字的不同,代码块一共可以分为四种:普通代码块、构造块、静态块、同步代码块(等待多线程的时候)。
尽可能在编写代码的时候不要去使用代码块。
一、普通代码块
如果说一个代码块写在了方法里面,那么就称它为普通代码块。
范例:观察如下代码
public class TestDemo {
public static void main(String args[]) {
if (true) {// 条件一定满足
int num = 10;// 局部变量
System.out.println("num = " + num);
}
int num = 100;// 全局
System.out.println("num = " + num);
}
}
如果现在取消了if语句:
public class TestDemo {
public static void main(String args[]) {
{// 普通代码块
int num = 10;// 局部变量
System.out.println("num = " + num);
}
int num = 100;// 全局
System.out.println("num = " + num);
}
}
实际上普通代码块就是为了防止在方法里面代码过多时有可能产生的变量重名,对一个方法的代码进行局部的分割,在以后编写代码的时候,一个方法里面的代码别写太长。
二、构造块
如果说现在将一个代码块写在了一个类里面,那么这个代码块就称为构造块。
范例:定义构造块
class Book {
public Book() {// 构造方法
System.out.println("【A】Book类的构造方法");
}
{// 将代码块写在了类里面
System.out.println("【B】Book类中的构造块");
}
}
public class TestDemo {
public static void main(String args[]) {
new Book();
new Book();
}
}
输出结果:
【B】Book类中的构造块
【A】Book类的构造方法
【B】Book类中的构造块
【A】Book类的构造方法
此时实例化Book类对象时,虽然执行的是Book类的构造方法,但是最终结果发现,构造块也被执行了,而且构造块的调用优先于构造方法执行。
如果现在产生了多个Book类的对象,那么构造块将会被重复执行多次。
三、静态块
如果说一个代码块使用了static进行定义的话,那么就称为静态块,可是静态块的使用需要分为两种情况:
情况一:在非主类中使用
class Book {
public Book() {// 构造方法
System.out.println("【A】Book类的构造方法");
}
{// 将代码块写在了类里面
System.out.println("【B】Book类中的构造块");
}
static {
System.out.println("【C】Book类中的构造块");
}
}
public class TestDemo {
public static void main(String args[]) {
new Book();
new Book();
}
}
输出结果:
【C】Book类中的构造块
【B】Book类中的构造块
【A】Book类的构造方法
【B】Book类中的构造块
【A】Book类的构造方法
现在可以发现,静态块将优先于构造块执行,而且不管有多少个实例化对象,静态块只执行一次。它的主要功能是为了类中的static属性初始化。
class Book {
static String msg;
public Book() {// 构造方法
System.out.println("【A】Book类的构造方法");
}
{// 将代码块写在了类里面
System.out.println("【B】Book类中的构造块");
}
static {
msg = "Hello".substring(0, 2);
System.out.println("【C】Book类中的构造块");
}
}
public class TestDemo {
public static void main(String args[]) {
new Book();
new Book();
System.out.println(Book.msg);
}
}
情况二:在主类中定义
public class TestDemo {
static {// 静态块
System.out.println("--------------------");
}
public static void main(String args[]) {
System.out.println("Hello World!!");
}
}
此时静态块将优先于主方法执行。