📜  Java中的构造方法重载

📅  最后修改于: 2020-04-03 08:24:44             🧑  作者: Mango

先决条件– 构造函数Java中的重载
除了重载方法,我们还可以重载Java中的构造函数。根据new执行时指定的参数调用重载的构造方法。

什么时候需要构造函数重载

有时需要以不同的方式初始化对象。这可以使用构造函数重载来完成。例如,Thread类具有8种构造函数。如果我们不想指定任何关于线程的内容,则可以简单地使用Thread类的默认构造函数,但是,如果我们需要指定线程名称,则可以使用String args调用Thread类的参数化构造函数,如下所示:

Thread t= new Thread (" 我的线程 ");

让我们举一个例子来了解构造函数重载的需求。考虑以下Box类的实现,其中只有一个构造函数带有三个参数。

// Java了解构造函数重载的需求
class Box
{
    double width, height,depth;
    // 单个参数构造函数
    Box(double w, double h, double d)
    {
        width = w;
        height = h;
        depth = d;
    }
    // 计算并返回volume
    double volume()
    {
        return width * height * depth;
    }
}

如我们所见,Box()构造函数需要三个参数。这意味着Box对象的所有声明必须将三个参数传递给Box()构造函数。例如,以下语句无效:

Box ob = new Box();

由于Box()需要三个参数,所以在没有它们的情况下调用它是错误的。假设我们只是想要一个没有初始尺寸的box对象,或者想要通过仅指定一个将用于所有三个尺寸的值来初始化多维数据对象。从Box类的上述实现中,这些选项对我们不可用。

可以通过构造函数重载来解决以不同方式初始化对象的问题。下面是具有构造函数重载的Box类的改进版本。

// Java展示构造函数重载
class Box
{
    double width, height, depth;
    // 参数化的构造函数
    Box(double w, double h, double d)
    {
        width = w;
        height = h;
        depth = d;
    }
    // 无参数构造函数
    Box()
    {
        width = height = depth = 0;
    }
    
    Box(double len)
    {
        width = height = depth = len;
    }
    // 计算并返回体积volume
    double volume()
    {
        return width * height * depth;
    }
}
// 测试代码
public class Test
{
    public static void main(String args[])
    {
        //  使用不同的构造函数创建对象
        Box mybox1 = new Box(10, 20, 15);
        Box mybox2 = new Box();
        Box mycube = new Box(7);
        double vol;
        // 获取第一个box的体积
        vol = mybox1.volume();
        System.out.println("mybox1的体积是 " + vol);
        // mybox2体积
        vol = mybox2.volume();
        System.out.println("mybox2的体积是 " + vol);
        // mycube体积
        vol = mycube.volume();
        System.out.println("mycube的体积是 " + vol);
    }
}

输出:

mybox1的体积是 3000.0
mybox2的体积是 0.0
mycube的体积是 343.0

在构造函数重载中使用this()

在构造函数重载期间,可以使用this()引用从参数化构造函数隐式调用默认构造函数。请注意,this()应该是构造函数中的第一条语句。

// Java展示在构造函数重载中使用this()
class Box
{
    double width, height, depth;
    int boxNo;
    // 带参数构造函数
    Box(double w, double h, double d, int num)
    {
        width = w;
        height = h;
        depth = d;
        boxNo = num;
    }
    // 无参数构造函数
    Box()
    {
        // 空box
        width = height = depth = 0;
    }
    // 一个参数的构造函数
    Box(int num)
    {
        // this()用来调用默认构造函数
        this();
        boxNo = num;
    }
    public static void main(String[] args)
    {
        //  box对象,仅包含boxNo
        Box box1 = new Box(1);
        // 打印box1的宽
        System.out.println(box1.width);
    }
}

输出:

0.0

正如我们在上面的程序中看到的那样,在对象创建期间仅调用了Box(int num)构造函数。通过在其中使用this()语句,将隐式调用默认构造函数(Box()),它将Box的尺寸初始化为0。
注意:构造函数调用this()应该是构造函数主体中的第一条语句。例如,以下片段无效,并引发编译时错误。

Box(int num)
{
    boxNo = num;
    /* 编译错误 */
    this();  /*ERROR*/
}

在进行构造函数重载时要注意的重要事项:

  • 构造函数调用this()必须是Java中构造函数的第一条语句。
  • 如果我们定义了任何参数化的构造函数,则编译器将不会创建默认构造函数。反之亦然,如果我们未定义任何构造函数,则编译器会在编译期间默认创建默认的构造函数(也称为无参数构造函数)
  • 递归构造函数调用在Java中无效。

构造函数重载与方法重载

严格来说,构造函数重载与方法重载有些相似。如果我们想要使用不同数量的参数来初始化对象的不同方法,那么当我们想要基于不同参数的方法的不同定义时,我们必须像方法重载那样进行构造函数重载。