我在面向对象编程中的第一堂课。
我应该为每个类创建一个构造函数方法吗?
例如
public class Cube2 {
int length;
int breadth;
int height;
public int getVolume() {
return (length * breadth * height);
}
Cube2() {
this(10, 10);
System.out.println("Finished with Default Constructor");
}
Cube2(int l, int b) {
this(l, b, 10);
System.out.println("Finished with Parameterized Constructor having 2 params");
}
Cube2(int l, int b, int h) {
length = l;
breadth = b;
height = h;
System.out.println("Finished with Parameterized Constructor having 3 params");
}
public static void main(String[] args) {
Cube2 cubeObj1, cubeObj2;
cubeObj1 = new Cube2();
cubeObj2 = new Cube2(10, 20, 30);
System.out.println("Volume of Cube1 is : " + cubeObj1.getVolume());
System.out.println("Volume of Cube2 is : " + cubeObj2.getVolume());
}
}
如果我想创建一个新的构造函数,我应该使用上一个(第一个)中使用的相同参数吗?
就像构造函数Cube2(int l, int b, int h)
除了变量(int h)
Cube2(int l, int b)
的参数也是一样的
答案 0 :(得分:4)
在很多情况下,不需要构造函数,特别是如果您计划使用inversion of control,其中需要一个默认构造函数。
但是对于您的多维数据集示例,它将使两个提供一个或两个构造函数。如果您认为在构造之后需要操作多维数据集参数,则采用默认构造函数,和/或采用实际创建多维数据集所需的三个参数的构造函数。
然而初始化使用前两个构造函数的对象在这种情况下并没有给我看,因为通常没有{{1}这样的东西对于一个立方体。 sensible defaults
连接的值timeout
可能存在合理的默认值。
答案 1 :(得分:3)
每个类至少有一个构造函数,无论它是否明确定义。
如果你没有明确声明一个构造函数,那么就为你定义一个:默认的无参数构造函数 - 一个无操作 - 它调用父类的无参数构造函数(super()
)。
如果父类缺少无参数构造函数,则需要声明构造函数 - 即使它什么也不做 - 如果父类只有带参数的构造函数,则必须显式调用父类的构造函数;因此,您需要为您的类定义至少一个构造函数。
如果该类不是由普通公众实例化的,那么您可能还希望定义具有除public之外的可见性的类的构造函数(例如,private
)。有些人认为,始终保持类的构造函数的可见性受到限制并且仅允许通过工厂方法进行公共实例化是一个好习惯 - 消费者不应该关心实际对象类型是什么,只是它是所需类型的子类型。这提供了更多的灵活性。
完全构造实例后,不要忘记类实例应该“可以使用”。当然,“随时可用”的定义是一个相当可调的概念。
答案 2 :(得分:2)
没有规则构造函数需要具有与另一个构造函数相同的参数。由于额外的构造函数通常只需要稍微不同,这只是最终发生的事情。
任何未定义构造函数的类都隐式具有无参数构造函数。但是,如果需要,必须在声明其他构造函数时显式声明无参数构造函数。因此,除非您需要信息或逻辑来构造对象,否则不需要显式构造函数。
答案 3 :(得分:2)
创建类的用户将使用的构造函数。这实际上只是为用户设计API的更一般想法的结果。尝试编写将首先使用您的课程的代码,然后您将看到您需要的方法。
如果你有一个方法与另一个方法相同但添加了一个参数,那么如果你一致地命名和排序其他参数,就会更容易理解。
您的第一个构造函数不是默认构造函数。默认构造函数是你不写任何东西的 - 你不可能写一个。你写的是一个no-args构造函数。
答案 4 :(得分:1)
如果你的类有属性,但是你不会传递新的值,或者你不希望程序员能够传递任何内容,那么在它的实例化中你就可以拥有默认的构造函数(即。没有参数)。
每个类都会(应该)至少拥有一个默认构造函数,如:
public class Cube {
Cube(){}
}
答案 5 :(得分:-1)
Constructor
。如果没有创建其他Constructor
,则编译器始终提供默认Constructor
。