构造函数重载的优点

时间:2013-08-26 12:34:28

标签: java constructor overloading

我是Java的新手,并试图学习这门课程,以前只在HTML / CSS中进行编程。我从Herbert Schildt开始,经历了几页。

我无法理解构造函数重载的确切优势。使用单一构造函数来重载方法是否更容易灵活?此外,如果我尝试使用构造函数重载来使用一个对象来初始化另一个对象,那么有更简单的方法可以做到这一点!那么有什么好处,在哪种情况下我应该使用构造函数重载。

6 个答案:

答案 0 :(得分:5)

构造函数重载对于模拟默认值非常有用,或者从已存在的实例构建对象(副本)
这是一个例子:

public class Color {

    public int  R, G, B, A;

    // base ctr
    public Color(int R, int G, int B, int A) {
        this.R = R;
        this.G = G;
        this.B = B;
        this.A = A;
    }

    // base, default alpha=255 (opaque) 
    public Color(int R, int G, int B) {
        this(R, G, B, 255);
    }

    // ctr from double values
    public Color(double R, double G, double B, double A) {
        this((int) (R * 255), (int) (G * 255), (int) (B * 255), (int) (A * 255));
    }

    // copy ctr
    public Color(Color c) {
        this(c.R, c.G, c.B, c.A);
    }

}

这里,第一个构造函数非常简单。你指定R,G,B&颜色的Alpha值。

虽然这足以使用Color类,但您提供了第二个构造函数升,如果用户未指定,则自动将255分配给alpha。

第三个ctr显示你可以使用0和1之间的双倍实例化Color对象,而不是整数。

最后一个将Color作为唯一参数,它复制给定的对象。

其优点还在于始终调用第一个构造函数,您可以使用它来手动计算实例。假设您有一个private static int count=0属性,您可以像这样跟踪Color实例的数量:

    // base ctr
    public Color(int R, int G, int B, int A) {
        this.R = R;
        this.G = G;
        this.B = B;
        this.A = A;
        ++count;
    }

count从任何构造函数递增。

答案 1 :(得分:2)

考虑构造函数重载的最简单示例:

Class A
{
int a;

A()
{
this.a = 0;
}

A(int a)
{
this.a = a;
}

} // end class

优势:现在,我可能只需要使用默认构造函数new A()来指定默认值,或者对于更动态的情况,指定必须为new A(10)的值{{1}}参数化构造函数。 do read this question

  

使用单一构造函数重载方法是否更容易实现灵活性?

构造函数的作用是实例化对象,方法的工作是处理对象值。因此,限制处理方法(setter methods的例外)和构造函数来创建对象将有助于长期运行,并使您的班级对您的队友更有用

  

此外,如果我尝试使用构造函数重载来使用它   对象初始化另一个,有更简单的方法来做到这一点!

替代方案是initializeralso read

答案 2 :(得分:1)

当你处理immutable classes并且想要提供多种方法来实例化它们时,那​​么重载构造函数很方便。

答案 3 :(得分:1)

这完全取决于你如何构建你的对象。

  

构造函数重载的经典示例之一是Java中的ArrayList。 ArrayList有三个构造函数,一个是空的,另一个是收集对象,另一个是初始容量。这些重载的构造函数允许在创建arraylist对象时具有灵活性。您可能有可能在创建期间不知道arraylist的大小,而不是简单地使用默认的无参数构造函数,但如果您知道大小,那么最好使用重载的构造函数来获取容量。由于ArrayList也可以从另一个Collection创建,可能来自另一个List而不是另一个重载的构造函数很有意义。通过使用重载的构造函数,您可以将ArrayList转换为Set或任何其他集合。

More info以及一般示例。

答案 4 :(得分:1)

构造函数的定义方式将确保在实例化时将构造函数的参数传递给对象。

重载方法不会“强迫”任何人调用它,这与构造函数中的参数不同,在构造函数中,如果不传递这些参数,则无法实例化对象。

有多种构造对象的方法可能很有用,就像Color类一样,在ndj的答案中,可以用四种不同的方式创建。每种方式都可以确保Color作为有用的最小信息,或“工作”。

如果Color只有一个没有参数的构造函数,那么这些信息可能会丢失,并且对于“工作”的类,将调用setR和其他方法...存在于Color类中。

答案 5 :(得分:0)

您可能在类中有多个变量......但是您希望在创建对象时仅初始化少数(一个或两个)变量。 所以在这种情况下,重载构造函数总是更好,以便您可以调用相应的构造函数取决于您的要求。 你应该记住的一件事是,..重载构造函数总是提供一个默认的构造函数(零参数构造函数).Even with empty implementation。