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

理解没有参数但有类变量的Java构造函数,java,Java,从我看到的一个类可以有两个不同的构造函数,区别在于每个构造函数中提供的参数数量,它们还给出了一个无构造函数参数的示例。基于这些信息和他们的例子。我写这堂课是为了更好地理解。我还注意到,no-param构造函数中的字段可以使用getter和setter方法进行更改,因此我看不到与具有参数的构造函数的区别。我在这里读到一些问题,但他们没有解决这个问题 我的问题是:是否有使用这种构造函数的具体案例,如果有,背后的原因是什么,是否有好处 public class Course { int nu

从我看到的一个类可以有两个不同的构造函数,区别在于每个构造函数中提供的参数数量,它们还给出了一个无构造函数参数的示例。基于这些信息和他们的例子。我写这堂课是为了更好地理解。我还注意到,no-param构造函数中的字段可以使用getter和setter方法进行更改,因此我看不到与具有参数的构造函数的区别。我在这里读到一些问题,但他们没有解决这个问题

我的问题是:是否有使用这种构造函数的具体案例,如果有,背后的原因是什么,是否有好处

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

    }

}

当用户在实例化时不影响任何值时,使用默认参数构造函数,因此可以使用默认值而不是空值,如果存在参数,则类使用受用户影响的参数

您会感到困惑,因为您的参数与字段同名。 您的无参数构造函数正在将字段设置为已经给定的值,这不是很有用-这样做没有意义。带有三个参数的构造函数将字段设置为要传递的值。因此,如果要将字段设置为默认值以外的值,则需要使用带有三个参数的构造函数。否则一个无参数构造函数就可以了(尽管它不需要做任何事情)。
请注意,在Java中,如果不提供构造函数,则可以免费获得无参数构造函数。但是,只要您编写一个带有参数的构造函数,就必须编写一个无参数构造函数(如果您需要的话)

当您想要为非最终属性提供默认值时,默认构造函数(没有参数的构造函数)肯定有一个用例。但是,您的示例不是提供此类默认值的推荐方法。您的属性应该在构造函数中初始化,否则您必须遍历类以了解值的来源。这样会更好

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;
    }
}

默认构造函数对类变量没有影响。 您不应该在声明类变量的地方初始化它,而应该在默认构造函数中进行初始化。

不,用“看起来很真实”的过于专业化的魔法值定义默认构造函数不是一个好主意,它只会在以后的调试过程中造成麻烦(“out database出了什么问题,这个Jane Doe是从哪里来的?”)


当存在一些“规范默认值”时,重写默认构造函数可能更有意义。例如,如果要对分数进行建模,则将分子设置为
0
,将分母设置为
1
,将给出一个很好的默认表示形式,将零表示为分数

构造函数执行会导致创建对象。创建对象后,用户代码在使用该对象之前不会被强制设置任何参数,即使可能有setter方法可用

参数化构造函数和setter方法。 假设有一个参数高度为int类型的类Duck。您可以使用setter方法来设置高度。现在,如果创建了Duck对象,用户代码可能会使用这个无效的Duck对象(高度为0)。即使存在setter方法,但在使用创建的对象之前,仍不会强制用户代码对其进行设置。为了强制创建具有必要生命参数的对象,需要参数化构造函数。setter方法使您能够在应用程序的运行时修改状态。基于修改后的状态,对象的行为也可以修改,因此它们有不同的用例,但参数化构造函数解决了不同的目的,正如我前面提到的


默认构造函数另一方面,允许用户创建状态设置为默认值的对象(这些默认值可以在类内部定义,而字段声明本身或在超类中,或在无参数构造函数调用的其他构造函数或方法中定义).

在java中重写默认构造函数的许多原因之一是,您希望初始化某些类级参数,这些参数将在不同的方法中处理,并且这些参数是初始化该类所必须的。。例如,在java中有许多关于此类非默认构造函数的示例

BufferedReader br=新的BufferedReader(fr)


其中fr是文件读取器对象。若文件流未传递给缓冲区读取器,则不能使用缓冲区读取器类

在def ctor中,
this.courseName=courseName
this.courseName=this.courseName相同。在你的例子中,没有参数的构造函数实际上是完全无用的。在没有参数的构造函数中,this.courseName=courseName
和其他两行完全没有用处,因为
这两行。courseName
courseName
都引用同一个变量。但是,拥有一个不带参数的构造函数通常不是没有用处的。只是在你的例子中,构造函数为自己赋值。请注意,每个构造函数中都有一个隐式的
super()
,除非编写了显式的构造函数调用。