Java Constructor 重载
java中的重载 除了重载方法,我们还可以在java中重载构造函数。在执行new时,重载的构造函数会根据指定的参数被调用。
我们什么时候需要构造函数重载 ?
有时需要以不同的方式初始化一个对象。这可以用构造函数重载来完成。例如,Thread类有8种类型的构造函数。如果我们不想指定任何关于线程的信息,那么我们可以简单地使用Thread类的默认构造函数,但是如果我们需要指定线程名称,那么我们可以像这样用字符串args调用Thread类的参数化构造函数。
Thread t= new Thread (" MyThread ");
让我们举一个例子来理解构造函数重载的必要性。考虑一下下面的Box类的实现,它只有一个构造函数,有三个参数。
// An example class to understand need of
// constructor overloading.
class Box
{
double width, height,depth;
// constructor used when all dimensions
// specified
Box(double w, double h, double d)
{
width = w;
height = h;
depth = d;
}
// compute and return volume
double volume()
{
return width * height * depth;
}
}
我们可以看到,Box()构造函数需要三个参数。这意味着,所有Box对象的声明都必须向Box()构造函数传递三个参数。例如,下面的语句目前是无效的。
Box ob = new Box();
由于Box()需要三个参数,所以在没有这些参数的情况下调用它是一个错误。假设我们只是想得到一个没有初始尺寸的盒子对象,或者想通过只指定一个用于所有三个尺寸的值来初始化一个立方体。从上述Box类的实现来看,这些选项对我们来说是不可用的。这些类型的对象初始化的不同方式的问题可以通过构造函数重载来解决。下面是改进后的带有构造函数重载的Box类的版本。
// Java program to illustrate
// Constructor Overloading
class Box
{
double width, height, depth;
// constructor used when all dimensions
// specified
Box(double w, double h, double d)
{
width = w;
height = h;
depth = d;
}
// constructor used when no dimensions
// specified
Box()
{
width = height = depth = 0;
}
// constructor used when cube is created
Box(double len)
{
width = height = depth = len;
}
// compute and return volume
double volume()
{
return width * height * depth;
}
}
// Driver code
public class Test
{
public static void main(String args[])
{
// create boxes using the various
// constructors
Box mybox1 = new Box(10, 20, 15);
Box mybox2 = new Box();
Box mycube = new Box(7);
double vol;
// get volume of first box
vol = mybox1.volume();
System.out.println(" Volume of mybox1 is " + vol);
// get volume of second box
vol = mybox2.volume();
System.out.println(" Volume of mybox2 is " + vol);
// get volume of cube
vol = mycube.volume();
System.out.println(" Volume of mycube is " + vol);
}
}
输出:
Volume of mybox1 is 3000.0
Volume of mybox2 is 0.0
Volume of mycube is 343.0
在构造函数重载中使用 this()
this()引用可以在构造函数重载时使用,以便从参数化构造函数中隐式调用默认构造函数。请注意,this()应该是构造函数中的第一个语句。
// Java program to illustrate role of this() in
// Constructor Overloading
public class Box
{
double width, height, depth;
int boxNo;
// constructor used when all dimensions and
// boxNo specified
Box(double w, double h, double d, int num)
{
width = w;
height = h;
depth = d;
boxNo = num;
}
// constructor used when no dimensions specified
Box()
{
// an empty box
width = height = depth = 0;
}
// constructor used when only boxNo specified
Box(int num)
{
// this() is used for calling the default
// constructor from parameterized constructor
this();
boxNo = num;
}
public static void main(String[] args)
{
// create box using only boxNo
Box box1 = new Box(1);
// getting initial width of box1
System.out.println(box1.width);
}
}
输出:
0.0
在上面的程序中,我们可以看到,在创建对象时,我们只使用了Box(int num)构造函数。通过在其中使用this()语句,默认的构造函数(Box())被隐式调用,这将使Box的尺寸初始化为0。 注意: 构造函数的调用应该是构造函数体的第一个语句。例如,下面的片段是无效的,会引发编译时错误。
Box(int num)
{
boxNo = num;
/* Constructor call must be the first
statement in a constructor */
this(); /*ERROR*/
}
在进行构造函数重载时需要注意的重要事项。
- 构造函数的调用必须是Java中构造函数的 第一条 语句。
- 如果我们定义了任何参数化的构造函数,那么编译器将不会创建默认的构造函数,反之亦然,如果我们没有定义任何构造函数,编译器将在编译过程中默认创建默认的构造函数(也被称为无参数构造函数)。
- 递归构造函数调用在java中是无效的。
构造函数重载与方法重载
严格来说,构造函数重载与方法重载有些类似。如果我们想用不同数量的参数对一个对象进行初始化,那么我们必须进行构造函数重载,就像我们想根据不同的参数对一个方法进行不同的定义时进行方法重载一样。