您的位置:首页 > 编程语言 > Java开发

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

2019-04-10 23:42 134 查看

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的,所以执行顺序可以在增加一条:只有当一个初始化(静态初始化块)块完全的执行完成时才会执行下一个初始化(静态初始化块)。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: