在Java中,使用{}括起来的代码被称为代码块,根据其位置和声明的不同,可以分为局部代码块,构造代码块,静态代码块,同步代码块。
(1)局部代码块:在方法中出现,限定变量的生命周期,及早释放,提高内存的利用 。
在同一个类中的同一个方法中,如果存在多个局部代码块,执行顺序是自上而下的。
(2)构造代码块:(在创建对象的时候调用)定义在类中方法外。当一个类中既存在构造代码块也存在构造方法的时候,在创建对象时,会先执行构造代码块,后执行构造方法。 无论类中有多少个构造代码块,构造代码块之间会先进行自上而下的顺序执行,然后再执行构造方法。 构造代码块 --> 构造方法
(3) 静态代码块:在类中方法外定义,并加上static修饰。 静态代码块是优先于其他代码块之前执行。在加载的时候执行,并且只执行一次。
(4)静态代码块 --> 构造代码块 --> 构造方法
eg:
class CodeBlocks{
static {
int e = 0;
System.out.print(e);
}
CodeBlocks(){
int c = 1;
System.out.print(c);
}
{
int g = 2;
System.out.print(g);
}
static {
int f = 3;
System.out.print(f);
}
}
public class CodeBlocksTest {
CodeBlocksTest(){
int i = 4;
System.out.print(i);
}
{
int j = 5;
System.out.print(j);
}
static {
int h = 6;
System.out.print(h);
}
public static void main(String[] args) {
{
int a = 7;
System.out.print(a);
}
{
int b = 8;
System.out.print(b);
}
CodeBlocksTest code3 = new CodeBlocksTest();
CodeBlocks code1 = new CodeBlocks();
{
int d = 9;
System.out.print(d);
}
CodeBlocks code2 = new CodeBlocks();
CodeBlocksTest code4 = new CodeBlocksTest();
}
}
//运行结果:67854032192154
class Fu {
static {
System.out.println("静态代码块Fu");
}
{
System.out.println("构造代码块Fu");
}
public Fu() {
System.out.println("构造方法Fu");
}
}
class Zi extends Fu {
static {
System.out.println("静态代码块Zi");
}
{
System.out.println("构造代码块Zi");
}
public Zi() {
System.out.println("构造方法Zi");
}
}
public class InheritCodeBlocksTest {
public static void main(String[] args) {
Zi z = new Zi();
}
}
/*
运行结果:
静态代码块Fu
静态代码块Zi
构造代码块Fu
构造方法Fu
构造代码块Zi
构造方法Zi
*/