从the java tutorial我看到一个类可以有两个不同的构造函数,区别在于每个构造函数中提供的参数数量,它们还给出了一个no构造函数参数的示例。基于该信息及其示例。我写了课程以便更好地理解。我还注意到可以使用getter和setter方法更改no param构造函数中的字段,因此我没有看到与具有参数的构造函数的差异。我在这里读过一些问题,但他们没有解决这个问题。
我的问题:是否应该使用这样的构造函数的特定情况,如果是,它背后的原因是什么并且有益处?
public class Course {
int numberOfStudents;
String courseName;
String courseLecturer;
public Course() {
this.courseName = "Human Science";
this.courseLecturer = "Jane Doe";
this.numberOfStudents = 22;
}
public Course(String courseName, String courseLecturer, int numberOfStudents) {
this.courseName = courseName;
this.courseLecturer = courseLecturer;
this.numberOfStudents = numberOfStudents;
}
public String getCourseName() {
return this.courseName;
}
public void setCourseName(String courseName) {
courseName = this.courseName;
}
public static void main(String[] args) {
Course courseType2 = new Course("CIV4046F", "Obi", 45);
System.out.println(courseType2.getCourseName());
}
}
答案 0 :(得分:2)
当用户没有影响实例化中的任何值时使用默认参数构造函数,因此可以使用默认值而不是空白,如果有参数,则类使用受用户影响的参数。
答案 1 :(得分:2)
当您要为非最终属性提供默认值时,默认构造函数(没有参数的构造函数)肯定存在用例。但是,您的示例不是提供此类默认值的推荐方法。您的属性应该在构造函数中初始化,否则您可以绕过类来了解值的来源。这会更好
public class Course {
//You should also keep these private to avoid them being set outside of the class
int numberOfStudents;
String courseName;
String courseLecturer;
public Course() {
this.courseName = "Human Science";
this.courseLecturer = "Jane Doe";
this.numberOfStudents = 22;
}
}
答案 2 :(得分:2)
不,定义默认构造函数"逼真地查找"过于专业化的魔术值并不是一个好主意,它只会在调试过程中造成麻烦("数据库出了什么问题,这个Jane Doe来自哪里?" )。
当存在某些"规范默认值"时,覆盖默认构造函数可能更有意义。例如,如果您对分数进行建模,那么将分子设置为0
并将分母设置为1
将给出零作为分数的良好默认表示。
答案 3 :(得分:2)
构造函数执行会导致创建对象。创建对象后,即使可能有setter方法,也不会强制用户代码在使用对象之前设置任何参数。
参数化构造函数和setter方法。 假设有一个类型为Duck的参数高度为Duck的类。您可以使用setter方法设置高度。现在,如果创建Duck的对象,则用户代码可以使用Duck的这个无效对象(高度为0)。即使存在setter方法,但在使用创建的对象之前,用户代码仍未强制进行设置。要强制创建具有必要生命给定参数的对象,需要参数化构造函数。使用setter方法可以在应用程序的运行时修改状态。基于修改后的状态,对象的行为也可以被修改,因此它们具有不同的用例,但参数化构造函数解决了上面提到的不同目的。
另一方面,默认构造函数为用户提供创建状态设置为默认值的对象(这些默认值可以在类声明本身或超类或其他构造函数中定义)或者没有参数构造函数调用的方法。
答案 4 :(得分:0)
您感到困惑,因为您的参数与您的字段具有相同的名称。 你的无参数构造函数将字段设置为已经给出的值,这不是非常有用 - 这样做没有意义。具有三个args的构造函数将字段设置为您传入的值。因此,如果要将字段设置为默认值以外的值,则需要使用带有三个args的构造函数。否则一个no-arg构造函数会做(尽管它不需要做任何事情)。 另请注意,如果您不提供构造函数,那么您将获得免费的无参数构造函数。但是一旦你用一个参数编写一个构造函数,你就必须编写一个无参数的构造函数(如果你想要的话)。
答案 5 :(得分:0)
答案 6 :(得分:0)
在java中覆盖默认构造函数的众多原因之一是你想要初始化一些类级参数,你要用不同的方法处理它们,那些参数必须初始化那个类。在java中有很多例子这些非默认构造函数,例如
BufferedReader br = new BufferedReader(fr)
其中fr是文件读取器对象。如果文件流未传递给缓冲区读取器,则无法使用缓冲区读取器类。