一. 概念
静态代码块:
声明位置:类的成员位置。
作用:初始化类的静态成员变量。
执行:类加载时执行,只执行一次。若有多个静态代码块,按代码块顺序执行。
构造代码块:
声明位置:类的成员位置。
作用:若有多个构造方法,可把构造方法中公共的代码提取到构造代码块中,避免代码重复。
执行:创建对象时,构造代码块先于构造方法执行,创建一次对象,执行一次构造代码块。
构造方法(有参无参):
声明位置:类的成员位置。
执行:创建对象时,构造代码块会放到原有构造方法代码的前面。构造代码块先执行,构造方法后执行。创建一次对象,执行一次构造方法。
作用:初始化对象的成员变量。
局部代码块:
声明位置:方法的局部位置。
执行:在方法中,按代码顺序执行。
作用:限定变量的生命周期。
二. 执行顺序
无继承
class CodeBlock{
public void hello(){
{
System.out.println("局部代码块......");
}
}
public CodeBlock(){
System.out.println(a);
System.out.println(b);
System.out.println("无参构造方法......");
}
public CodeBlock(int i){
System.out.println("有参构造方法......");
}
{
System.out.println("构造代码块......");
System.out.println("构造方法公共代码......");
}
static{
System.out.println("静态代码块......");
}
private int a;
private String b;
public static void main(String[] args){
CodeBlock c1 = new CodeBlock();
c1.hello();
System.out.println("--------------------------------");
CodeBlock c2 = new CodeBlock(1);
c2.hello();
}
}
执行结果:
静态代码块......
构造代码块......
构造方法公共代码......
0
null
无参构造方法......
局部代码块......
--------------------------------
构造代码块......
构造方法公共代码......
有参构造方法......
局部代码块......
执行顺序:
静态代码块 > 构造代码块 > 构造方法代码块 > 局部代码块
反编译CodeBlock.class文件
class CodeBlock
{
private int a;
private String b;
static
{
System.out.println("静态代码块......");
}
public void hello()
{
System.out.println("局部代码块......");
}
public CodeBlock()
{
System.out.println("构造代码块......");
System.out.println("构造方法公共代码......");
System.out.println(this.a);
System.out.println(this.b);
System.out.println("无参构造方法......");
}
public CodeBlock(int i)
{
System.out.println("构造代码块......");
System.out.println("构造方法公共代码......");
System.out.println("有参构造方法......");
}
public static void main(String[] args)
{
CodeBlock c1 = new CodeBlock();
c1.hello();
System.out.println("--------------------------------");
CodeBlock c2 = new CodeBlock(1);
c2.hello();
}
}
有继承
class Father{
public Father(){
System.out.println("父类构造方法");
}
{
System.out.println("父类构造代码块");
}
static{
System.out.println("父类静态代码块");
}
}
class Son extends Father{
public Son(){
System.out.println("子类构造方法");
}
{
System.out.println("子类构造代码块");
}
static{
System.out.println("子类静态代码块");
}
public void hello(){
{
System.out.println("子类局部代码块");
}
}
}
public class CodeBlockExtends {
public static void main(String[] args) {
Son s = new Son();
s.hello();
}
}
父类静态代码块
子类静态代码块
父类构造代码块
父类构造方法
子类构造代码块
子类构造方法
子类局部代码块