理解没有参数但带有类变量的Java构造函数

时间:2018-05-15 13:58:13

标签: java

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());

    }

}

7 个答案:

答案 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)

您的默认构造函数对类变量没有影响。 而不是初始化声明它的类变量,你应该在默认构造函数中初始化。  enter image description here

答案 6 :(得分:0)

在java中覆盖默认构造函数的众多原因之一是你想要初始化一些类级参数,你要用不同的方法处理它们,那些参数必须初始化那个类。在java中有很多例子这些非默认构造函数,例如

BufferedReader br = new BufferedReader(fr)

其中fr是文件读取器对象。如果文件流未传递给缓冲区读取器,则无法使用缓冲区读取器类。