Java 对象构造执行顺序

引用自《Java 核心技术 卷1》ch4.6 对象构造

构造器的具体处理步骤:

  1. 如果构造器第一行调用了第二个构造器, 则基于所提供的的参数执行第二个构造器
  2. 否则,
    1. 所有数据域被初始化为默认值(0、false 或null)。
    2. 按照在类声明中出现的次序, 依次执行所有域初始化语句和初始化块。
    • 先执行静态初始化块,再执行对象初始化块。
    • 静态初始化块只执行一次,对象初始化块在每次创建这个类的对象时均执行
  3. 执行这个构造器的主体.

代码如下:(书上的代码)

public class ConstructorTest {
	public static void main(String[] args) {
		Employee[] staff = new Employee[3];
		
		staff[0] = new Employee("harry", 4000);
		staff[1] = new Employee(6000);
		staff[2] = new Employee();
		
		for (Employee employee : staff) {
			System.out.println("name = " + employee.getName() 
				+ ", id = " + employee.getId() + ", salary = " + employee.getSalary());
		}
	}
}

class Employee {
	private static int nextId;
	
	private int id;
	private String name = "tom"; // 实例字段初始化
	private double salary;
	
	// 静态初始化块(只执行一次,且先于对象初始化之前执行)
	static {
		System.out.println("静态初始化块");
		Random generator = new Random();
		// set nextId to a random number between 0 and 9999
		nextId = generator.nextInt(10000);
	}
	
	// 对象初始化块(每次创建对象都执行一次)
	{
		System.out.println("对象初始化块");
		System.out.println("name = " + name); // 实例字段初始化优先于对象初始化之前执行
		id = nextId;
		nextId++;
	}
	
	// three overload constructor(在实例字段初始化、静态初始化块、对象初始化块之后执行)
	public Employee(String name, double salary) {
		System.out.println("构造器:Employee(String name, double salary)");
		this.name = name;
		this.salary = salary;
	}
	
	public Employee(double s) {
		// call the Employee(String name, double salary) constructor
		this("Employee #" + nextId, s);
		System.out.println("构造器:Employee(double s)");
	}
	
	// the default constructor
	public Employee() {
		System.out.println("构造器:Employee()");
		// name initialized to "" --see above
		// salary not explicitly set --initialized to 0
		// id initialized in initialization block
	}

	public double getId() {
		return id;
	}
	
	public double getSalary() {
		return salary;
	}

	public void setSalary(double salary) {
		this.salary = salary;
	}
	
	public void raiseSalary(double byPercent) {
		double raise = salary * byPercent / 100;
		salary += raise;
	}

	public String getName() {
		return name;
	}
	
	public boolean equals(Employee other) {
		// 类中的一个方法可以访问所有所属类的所有对象的私有数据
		return name.equals(other.name); 
	}
}

执行结果如下:
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值