Java-静态代码块、构造代码块、构造函数

执行顺序:静态代码块>main函数>构造代码块>构造函数

一、构造函数

class A{
	public A(){
		//构造函数
	}
}

构造函数的注意事项

  • 只有实例化对象时才会调用相应的构造函数,不创建对象构造函数不会被调用
  • 使用关键字new来调用构造函数

二、构造代码块

class A{
	public A(){
		//构造函数1
	}
	public A(Type t){
		//构造函数2
	}

	{
		//构造代码块1
	}
	{
		//构造代码块2
	}
}

构造代码块的注意事项

  • 构造代码块又叫初始化块,在一个类的声明中可以包含多个初始化块相同类型的初始化块之间有顺序:前面定义的初始化块先执行,后面定义的初始化块执行
  • 只有实例化对象,这些构造代码块才会被执行,且执行顺序优先于构造函数(构造代码块>构造函数),构造代码块依托于构造函数
  • 无论使用哪一个构造函数构造对象,首先运行构造代码块,然后再运行相应的构造器所以不同对象有着相同的初始化块
  • 构造代码块和静态代码块的区别是少了static关键字

三、静态代码块

class A{
	public A(){
		//构造函数1
	}
	public A(Type t){
		//构造函数2
	}

	{
		//构造代码块1
	}
	{
		//构造代码块2
	}
	static{
		//静态代码块1
	}
	static{
		//静态代码块2
	}
}

静态代码块的注意事项

  • 静态代码块随着类的加载而执行,并且只执行一次
  • 静态代码块只能调用静态变量,不能调用非静态变量
  • 静态代码块用来给类初始化的,构造代码块用来给对象初始化
  • 一个类中可以有多个静态代码块,前面定义的静态代码块先执行,后面定义的静态代码块后执行
  • 静态代码块优先于main函数

四、Java中的初始化顺序

4.1 在一个类中的初始化顺序

  1. 静态代码块(只执行一次)
  2. 构造代码块
  3. 构造函数
public class A{
	
	public A(){
		//构造函数1
		System.out.println("构造函数1");
	}
	public A(int t){
		//构造函数2
		System.out.println("构造函数2");
	}

	{
		//构造代码块1
		System.out.println("构造代码块1");
	}
	{
		//构造代码块2
		System.out.println("构造代码块2");
	}
	static{
		//静态代码块1
		System.out.println("静态代码块1");
	}
	static{
		//静态代码块2
		System.out.println("静态代码块2");
	}
	
	//程序入口
	public static void main(String[] args) {
		System.out.println("这里是main函数");
		new A();
		System.out.println("----------");
		new A();
	}
}
//执行结果
静态代码块1
静态代码块2
这里是main函数 	//这里可以看出,静态代码块执行优先于main函数
构造代码块1
构造代码块2
构造函数1
----------
构造代码块1
构造代码块2
构造函数1

4.2 继承中的初始化顺序

  1. 执行父类的静态代码块
  2. 执行子类静态代码块
  3. 执行父类构造代码块,执行父类的构造函数
  4. 执行子类的构造代码块,执行子类的构造函数
public class A {
	public static void main(String[] args) {
		new B();
	}
	public A(){
		//构造函数1
		System.out.println("A构造函数1");
	}
	public A(int t){
		//构造函数2
		System.out.println("A构造函数2");
	}

	{
		//构造代码块1
		System.out.println("A构造代码块1");
	}
	{
		//构造代码块2
		System.out.println("A构造代码块2");
	}
	static{
		//静态代码块1
		System.out.println("A静态代码块1");
	}
	static{
		//静态代码块2
		System.out.println("A静态代码块2");
	}
}

class B extends A{
	public B(){
		//构造函数1
		System.out.println("B构造函数1");
	}
	public B(int t){
		//构造函数2
		System.out.println("B构造函数2");
	}

	{
		//构造代码块1
		System.out.println("B构造代码块1");
	}
	{
		//构造代码块2
		System.out.println("B构造代码块2");
	}
	static{
		//静态代码块1
		System.out.println("B静态代码块1");
	}
	static{
		//静态代码块2
		System.out.println("B静态代码块2");
	}
}
//执行结果
A静态代码块1
A静态代码块2
B静态代码块1
B静态代码块2

A构造代码块1
A构造代码块2
A构造函数1

B构造代码块1
B构造代码块2
B构造函数1
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值