当我们可以在java中初始化数据成员时,为什么我们需要默认构造函数?

时间:2014-12-16 19:16:54

标签: java constructor

我的问题是,当我们使用数据成员声明一个java类时,我们通常使用构造函数初始化它们(静态成员除外)。但是也可以直接初始化数据成员而无需调用构造函数。

public class Box {
      public int height = 0;
      public int width = 0;
}

如果可能,为什么我们需要默认构造函数?像这样

public Box(){
      height = 0;
      width = 0;
}

实例化对象的内存。但是,如果在创建对象时分配了数据成员的内存,那么在类的开头如何初始化数据成员呢?

4 个答案:

答案 0 :(得分:1)

对于您可以初始化数据成员的简单情况,如您的示例所示,您不需要默认构造函数。

但是,您可能希望在默认构造函数中执行更多操作,而不是初始化某些字段;

调用超类的非默认构造函数:

public class Box extends Shape {
      public int height = 0;
      public int width = 0;

      public Box() {
         super("Box");
}

做一些工作作为构造函数的一部分:

public class Boxes {
     private HashMap<String, Box> boxes = new HashMap<String, Box>();

      public Boxes() {
         boxes.put("2x2", new Box(2,2));
         boxes.put("4x4", new Box(4,4));
         ....
}

提供非默认构造函数以及默认构造函数。

如果创建非默认构造函数,则不会自动创建默认构造函数。

public class Box {
      public int height;
      public int width;

      public Box() {
         height = 0;
         width = 0;
         //or simply call Box(0,0)
      }
      public Box(int height, int width) {
         this.height = heigth;
         this.width = width;
      }
}

没有无参数Box()构造函数的代码,因为有new Box()构造函数,所以不能Box(int height, int width)。但是,如果您不编写任何构造函数,编译器会为您创建无参数Box()构造函数。

答案 1 :(得分:0)

如果您的类没有其他构造函数并且外部框架(或可能是您自己的代码)可以创建它的实例并且需要使用默认构造函数,那么您并不特别需要默认构造函数。 / p>

一些例子:

  • Jackson使用ObjectMapper#readValue
  • 进行JSON反序列化
  • 创建托管bean时的JSF

如果您没有这种情况,那么您甚至不需要添加默认构造函数,编译器将为您完成。

答案 2 :(得分:0)

除了使用常量值初始化之外,您还需要构造函数来执行更复杂的操作。例如,您希望在创建实例时动态地将对象传递到另一个类。可以找到一个简单的文档here

答案 3 :(得分:0)

构造函数用于初始化一个对象,添加一些状态,以便在我们开始调用它之前使对象可以使用。初始化对象可以是为默认值以外的实例变量设置一些值,或者将项添加到ArrayList或Map以在该类中定义的方法中使用这些值。

为了更好地理解,我建议您参考此链接 - Class and Object Initialization