Java中静态初始化块、初始化块、构造方法的执行顺序

Java中的初始化顺序包括静态初始化块、初始化块和构造方法。静态初始化块在类加载时执行一次,而初始化块在每次创建对象时执行。构造方法则在每次初始化实例时调用。执行顺序为:类加载时执行静态初始化块,然后每次创建对象时先执行初始化块,最后执行构造方法。在涉及嵌套初始化时,会确保当前初始化块完全执行完后再执行下一个。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java中静态初始化块、初始化块、构造方法的执行顺序

java里初始化一个类的对象,通过初始化块或者构造方法进行数据赋值。与其相关的执行代码有这么几种:

  • 静态初始化块
  • 初始化块
  • 构造方法

静态初始化块

静态初始化块是由static修饰的初始化块,只在类加载时执行一次,而且当一个静态初始化块没有执行完成时不会执行下一个静态初始化块。


初始化块

初始化块在每次初始化实例对象的时候都执行一次,可以给任意变量赋值。


构造方法

在每次初始化实例对象时调用。


重点:执行顺序

  1. 在加载类时执行一次静态初始化块(之后不再调用)。
  2. 在每次初始化实例对象时:先执行非静态初始化块。
  3. 再执行构造方法。

这是一个基本的原则,但是往往在实际操作过程中就会存在一个较为复杂的情况,比如如下:

import java.time.LocalDate;
import java.util.Date;
class Employee {
	   private String name;
	   private double salary;
	   private Date hireDay;
	   private static int id=0;
	   private static int age;
	   {
		   System.err.println("初始化1");
		   name = "zhangsan";
	   }
	   {
		System.err.println("初始化2");   
	   salary = 200;
	   }
	   static{
		   System.err.println("静态初始化1");
		    id= 1;  
		    Employee a = new Employee();
		    System.err.println(a);
	   }
	   static{
		   System.err.println("静态初始化2");
		   age = 0;   
	   }
	public String toString() {
		return "Employee [name=" + name + ", salary=" + salary + ", 
		hireDay=" + hireDay + "]";
	}
	public static int getId() {
		return id;
	}	  
	   public String getName()
	   {
	      return name;
	   }

	   public double getSalary()
	   {
	      return salary;
	   }

	   public Date getHireDay()
	   {
	      return (Date)hireDay.clone();
	   }
	   public void raiseSalary(double byPercent)
	   {
	      double raise = salary * byPercent / 100;
	      salary += raise;
	   }
	  public Employee(String n,int i)
	  {
	  name = n;
	  id = i;
	  }
	  public Employee()
	  {
		name="";
		id = 0 ;
		}
}

上述代码中存在两个静态初始化块,两个初始化块和两个构造方法(一个无参,一个有参),但是在第一个静态初始化块中存在一个比较复杂的问题,存在一个Employee类的初始化,那么他该如何运行呢?我给出了下面的测试代码和结果。
代码如下:

Employee tom =new Employee();
		int id = tom.getId();
		Employee tom2 =new Employee();
		int id2 = tom2.getId();
		String name = tom.getName();
		System.err.println(id);
		System.err.println(name);
		String name2 = tom2.getName();
		System.err.println(id2);		
		System.err.println(name2);

结果如下:
在这里插入图片描述
可以很明显的看出在执行静态初始化块1的时候,是先完成了Employee类 a的初始化在进行静态初始化块2的,所以执行顺序可以在增加一条:只有当一个初始化(静态初始化块)块完全的执行完成时才会执行下一个初始化(静态初始化块)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值