Java Bean Order 顺序科普

Java Bean 是 Java 程序中常用的一种实体类,用于封装数据。在 Java Bean 中,属性的赋值顺序是非常重要的。本文将介绍 Java Bean 属性赋值的顺序以及相应的原理。

什么是 Java Bean?

Java Bean 是 Java 程序中用于封装数据的一种特殊类。它是一个普通的 Java 类,具有私有的属性、公共的 getter 和 setter 方法、无参的构造方法以及可选的其他方法。

Java Bean 的属性通常使用私有字段来表示,通过公共的 getter 和 setter 方法来访问和修改属性的值。这种方式可以保护数据的封装性,同时提供了一种标准的访问方式。

public class Person {
    private String name;
    private int age;
    
    public Person() {
        // 无参构造方法
    }
    
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }
    
    public int getAge() {
        return age;
    }
    
    public void setAge(int age) {
        this.age = age;
    }
}

上述代码定义了一个名为 Person 的 Java Bean 类,它有两个属性 nameage,以及对应的 getter 和 setter 方法。

Java Bean 属性赋值顺序

Java Bean 属性的赋值顺序是由 JVM 决定的。通常情况下,JVM 会按照以下顺序进行属性的赋值:

  1. 默认值赋值
  2. 构造方法赋值
  3. 属性赋值
  4. 初始化块赋值
  5. 静态初始化块赋值

默认值赋值

当创建一个 Java Bean 对象时,JVM 会为属性赋予默认值。对于基本数据类型,例如 intdouble,默认值为 0;对于引用类型,例如 String,默认值为 null

构造方法赋值

构造方法是用来创建对象并初始化属性的特殊方法。当调用构造方法时,可以传入参数来设置属性的值。

public Person(String name, int age) {
    this.name = name;
    this.age = age;
}

在上述代码中,我们定义了一个带有参数的构造方法,可以在创建对象时直接设置属性的值。

属性赋值

在调用构造方法之后,JVM 会逐个设置属性的值。如果在构造方法中没有设置某个属性的值,JVM 会使用默认值。

Person person = new Person();
person.setName("John");
person.setAge(30);

在上述代码中,我们通过调用 setter 方法来设置属性的值。

初始化块赋值

初始化块是在构造方法之前执行的一段代码,可以用来初始化属性或执行其他逻辑。初始化块的代码会在构造方法之前执行,因此可以在这里对属性进行赋值。

public class Person {
    private String name;
    private int age;
    
    {
        name = "Default";
        age = 0;
    }
    
    // ...
}

在上述代码中,我们在类中添加了一个初始化块,在其中设置了属性的默认值。

静态初始化块赋值

静态初始化块是在类被加载时执行的一段代码,可以用来初始化静态属性或执行其他静态逻辑。静态初始化块的代码只会执行一次。

public class Person {
    private static String country;
    
    static {
        country = "China";
    }
    
    // ...
}

在上述代码中,我们在类中添加了一个静态初始化块,在其中设置了静态属性 country 的初始值。

Java Bean Order 顺序示例

下面我们来通过一个实例来演示 Java Bean 属性赋值的顺序。

public class Person {
    private String name;
    private int age;
    
    {
        name = "Default";
        age = 0;
    }
    
    public Person() {
        // 无参构造方法
    }
    
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    
    public String getName() {
        return name;