Java Constructor 重载
java中的重载 除了重载方法,我们还可以在java中重载构造函数。在执行new时,重载的构造函数会根据指定的参数被调用。
我们什么时候需要构造函数重载 ?
有时需要以不同的方式初始化一个对象。这可以用构造函数重载来完成。例如,Thread类有8种类型的构造函数。如果我们不想指定任何关于线程的信息,那么我们可以简单地使用Thread类的默认构造函数,但是如果我们需要指定线程名称,那么我们可以像这样用字符串args调用Thread类的参数化构造函数。
让我们举一个例子来理解构造函数重载的必要性。考虑一下下面的Box类的实现,它只有一个构造函数,有三个参数。
我们可以看到,Box()构造函数需要三个参数。这意味着,所有Box对象的声明都必须向Box()构造函数传递三个参数。例如,下面的语句目前是无效的。
由于Box()需要三个参数,所以在没有这些参数的情况下调用它是一个错误。假设我们只是想得到一个没有初始尺寸的盒子对象,或者想通过只指定一个用于所有三个尺寸的值来初始化一个立方体。从上述Box类的实现来看,这些选项对我们来说是不可用的。这些类型的对象初始化的不同方式的问题可以通过构造函数重载来解决。下面是改进后的带有构造函数重载的Box类的版本。
输出:
在构造函数重载中使用 this()
this()引用可以在构造函数重载时使用,以便从参数化构造函数中隐式调用默认构造函数。请注意,this()应该是构造函数中的第一个语句。
输出:
在上面的程序中,我们可以看到,在创建对象时,我们只使用了Box(int num)构造函数。通过在其中使用this()语句,默认的构造函数(Box())被隐式调用,这将使Box的尺寸初始化为0。 注意: 构造函数的调用应该是构造函数体的第一个语句。例如,下面的片段是无效的,会引发编译时错误。
在进行构造函数重载时需要注意的重要事项。
- 构造函数的调用必须是Java中构造函数的 第一条 语句。
- 如果我们定义了任何参数化的构造函数,那么编译器将不会创建默认的构造函数,反之亦然,如果我们没有定义任何构造函数,编译器将在编译过程中默认创建默认的构造函数(也被称为无参数构造函数)。
- 递归构造函数调用在java中是无效的。
构造函数重载与方法重载
严格来说,构造函数重载与方法重载有些类似。如果我们想用不同数量的参数对一个对象进行初始化,那么我们必须进行构造函数重载,就像我们想根据不同的参数对一个方法进行不同的定义时进行方法重载一样。