6

我对 Java 很陌生,并试图学习这个主题,以前只接触过 HTML/CSS 编程。我从 Herbert Schildt 开始,并通过几页进展。

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

4

6 回答 6

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 类,但您提供了第二个构造函数 liter,如果用户未指定,它将自动将 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从任何构造函数递增。

于 2013-08-26T12:42:03.550 回答
2

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

Class A
{
int a;

A()
{
this.a = 0;
}

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

} // end class

优点:现在我可能只需要使用默认构造函数来分配默认值,或者对于更动态的情况,指定参数化构造函数 new A()必须是什么值。请阅读这个问题new A(10)

使用单个构造函数来重载方法不是更容易吗?

构造函数的工作是实例化对象,方法的工作是处理对象的值。因此,将方法限制为处理(setter 方法除外)和构造函数以创建对象从长远来看将有所帮助,并使您的类对您的队友更有用

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

替代是初始化器也读

于 2013-08-26T18:33:37.680 回答
1

当您处理不可变类并且想要提供多种方法来实例化它们时,重载构造函数很方便。

于 2013-08-26T12:42:21.053 回答
1

这完全取决于您如何构造对象。

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

带有一般示例的更多信息。

于 2013-08-26T12:51:15.587 回答
1

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

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

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

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

于 2013-08-26T12:55:21.953 回答
0

一个类中可能有多个变量...但是您只想在创建对象时初始化几个(一个或两个)变量。所以在这种情况下,最好有重载的构造函数,这样你就可以调用各自的构造函数,这取决于你的要求。你应该永远记住的一件事,.. 虽然重载构造函数总是提供一个默认构造函数(零参数构造函数)。即使是空实现。

于 2013-08-26T12:59:13.830 回答