Java代码块执行顺序

一. 概念

静态代码块:
声明位置:类的成员位置。
作用:初始化类的静态成员变量。
执行:类加载时执行,只执行一次。若有多个静态代码块,按代码块顺序执行。
构造代码块:
声明位置:类的成员位置。
作用:若有多个构造方法,可把构造方法中公共的代码提取到构造代码块中,避免代码重复。
执行:创建对象时,构造代码块先于构造方法执行,创建一次对象,执行一次构造代码块。
构造方法(有参无参):
声明位置:类的成员位置。
执行:创建对象时,构造代码块会放到原有构造方法代码的前面。构造代码块先执行,构造方法后执行。创建一次对象,执行一次构造方法。
作用:初始化对象的成员变量。
局部代码块:
声明位置:方法的局部位置。
执行:在方法中,按代码顺序执行。
作用:限定变量的生命周期。

二. 执行顺序

无继承

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();
	}
}
父类静态代码块
子类静态代码块
父类构造代码块
父类构造方法
子类构造代码块
子类构造方法
子类局部代码块
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值