静态语句块、构造语句块和构造函数的执行顺序

public class A {
	//构造方法
	public A(){
		System.out.println("A--->父类构造方法");
	}
	//非静态代码块
	{
		System.out.println("A--->父类非静态代码块");
	}
	//静态代码块
	static{
		System.out.println("A--->父类静态代码块");;
	}

}
public class B extends A{
	//构造方法
	public B(){
		System.out.println("B--->构造方法");
	}
	//非静态语句块
	{
		System.out.println("B--->非静态语句块");
		
	}
	//静态语句块
	static{
		System.out.println("B--->静态语句块");
		
	}
	public static void main(String[] args) {
		System.out.println("----开始----");
		new B();
		System.out.println("----结束----");
	}
}

运行结果:
在这里插入图片描述

new两次

public class B extends A{
	//构造方法
	public B(){
		System.out.println("B--->构造方法");
	}
	//非静态语句块
	{
		System.out.println("B--->非静态语句块");
		
	}
	//静态语句块
	static{
		System.out.println("B--->静态语句块");
		
	}
	public static void main(String[] args) {
		System.out.println("----开始----");
		new B();
		new B();
		System.out.println("----结束----");
	}
}

运行结果:在这里插入图片描述
静态块属于类的,非静态属于对象,有对象才有类,有类不一定有对象。打个比方,有车子一定有图纸,有图纸未必有车子。静态块用于类的初始化,构造函数用于对象的初始化,所以静态块在非静态块之前执行。静态代码只在第一次new执行一次,之后不再执行,而非静态块每new一次就执行一次。
所以静态方法>非静态语句块>构造方法
在这里插入图片描述
上图是我遇到的面试题

import Test02.Test01;

public class Test01 {
	public static Test01 t1 = new  Test01();
	
	{
		System.out.print("blockA");
	}
	
	static {
		System.out.print("blockB");
		
	}
	public static void main(String[] args) {
		System.out.print("开始");
		Test01 t2 = new Test01();
		System.out.println("结束");
		
	}
}

运行结果:C,运行程序时先运行静态方法new了一个t1对象,t1里面就一个语句块,然后就打印了A,然后在执行下一个静态方法打印B,这些都在mian方法之前执行的,然后在执行main,然后打印"开始",再new t2这个对象,因为静态方法只在类加载的时候执行一次,所以就打印A,所以选C。
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值