java构造函数顺序

标签 java constructor

这个java程序很简单,而且有很多注释,所以你可以很快理解它。但是,为什么在构造staff[1]时,程序首先转到语句:

this("Employee #" + nextId, s);

然后转到对象初始化 block ,然后再回到语句,好困惑。为什么不先使用对象初始化 block

import java.util.*;

public class ConstructorTest
{
   public static void main(String[] args)
   {
      // fill the staff array with three Employee objects
      Employee[] staff = new Employee[3];

      staff[0] = new Employee("Harry", 40000);
      staff[1] = new Employee(60000);
      staff[2] = new Employee();

      // print out information about all Employee objects
      for (Employee e : staff)
         System.out.println("name=" + e.getName()
            + ",id=" + e.getId()
            + ",salary=" + e.getSalary());
   }
}

class Employee
{
   // three overloaded constructors
   public Employee(String n, double s)
   {
      name = n;
      salary = s;
   }

   public Employee(double s)
   {
      // calls the Employee(String, double) constructor
      this("Employee #" + nextId, s);
   }

   // the default constructor
   public Employee()
   {
      // name initialized to ""--see below
      // salary not explicitly set--initialized to 0
      // id initialized in initialization block
   }

   public String getName()
   {
      return name;
   }

   public double getSalary()
   {
      return salary;
   }

   public int getId()
   {
      return id;
   }

   private static int nextId;

   private int id;
   private String name = ""; // instance field initialization
   private double salary;

   // static initialization block
   static
   {
      Random generator = new Random();
      // set nextId to a random number between 0 and 9999
      nextId = generator.nextInt(10000);
   }

   // object initialization block
   {
      id = nextId;
      nextId++;
   }
}

最佳答案

因为 this("Employee #"+ nextId, s); 包含对父类(super class)构造函数的隐式调用,当然必须在子类的初始化 block 之前执行。

使用实例初始化器通常是一个坏主意,因为它们并不为人所知,除了构造函数之外不能做任何事情,并且混合两者会导致困惑。

关于java构造函数顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7687030/

相关文章:

java - 将 Cursor 转换为通用对象 android

java - 如何在枚举中创建多个二维数组?

php - 特征是否可以具有具有私有(private)和 protected 可见性的属性和方法?特征可以有构造函数、析构函数和类常量吗?

c++ - 在构造函数中引用未初始化的对象

java - 将 C++ 原始类型 vector 转换为 Java 原始类型数组

java - 修改 JDBC 代码以针对 Inesrt/Update/Deletions 的多个数据库服务器

java - 我想通过单击添加按钮动态添加 JLabel 和文本框

java - getValue() 方法可以通过两种方式重写。哪一个是正确的?

java - java : constructor in class cannot be applied to given types

excel - VBA通过构造继承,构造函数不起作用?