我的问题是,当我们使用数据成员声明一个java类时,我们通常使用构造函数初始化它们(静态成员除外)。但是也可以直接初始化数据成员而无需调用构造函数。
public class Box {
public int height = 0;
public int width = 0;
}
如果可能,为什么我们需要默认构造函数?像这样
public Box(){
height = 0;
width = 0;
}
实例化对象的内存。但是,如果在创建对象时分配了数据成员的内存,那么在类的开头如何初始化数据成员呢?
答案 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>
一些例子:
ObjectMapper#readValue
如果您没有这种情况,那么您甚至不需要添加默认构造函数,编译器将为您完成。
答案 2 :(得分:0)
除了使用常量值初始化之外,您还需要构造函数来执行更复杂的操作。例如,您希望在创建实例时动态地将对象传递到另一个类。可以找到一个简单的文档here
答案 3 :(得分:0)
构造函数用于初始化一个对象,添加一些状态,以便在我们开始调用它之前使对象可以使用。初始化对象可以是为默认值以外的实例变量设置一些值,或者将项添加到ArrayList或Map以在该类中定义的方法中使用这些值。
为了更好地理解,我建议您参考此链接 - Class and Object Initialization