【问题标题】:Advantages of Constructor Overloading构造函数重载的优点
【发布时间】:2013-08-26 12:34:28
【问题描述】:

我对 Java 非常陌生,并且正在尝试学习该主题,之前仅接触过 HTML/CSS 编程。我从 Herbert Schildt 开始,并通过几页进展。

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

【问题讨论】:

  • Schildt 在 Java 方面的名声好吗?我记得当他试图写关于 C 和 C++ 的书时,他基本上是个笑柄......
  • Schildt 的 Java 书不错。。不知道 C 和 C++ 的。这本 Java 书从最基础的开始。所以对于刚接触 OOP 和 Java 的人来说,这真的很有启发性。

标签: java constructor overloading


【解决方案1】:

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

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从任何构造函数中递增。

【讨论】:

    【解决方案2】:

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

    Class A
    {
    int a;
    
    A()
    {
    this.a = 0;
    }
    
    A(int a)
    {
    this.a = a;
    }
    
    } // end class
    

    优势:现在我可能只需要使用默认构造函数new A() 来分配默认值,或者对于更动态的情况,指定它必须是什么值new A(10),这是一个参数化构造函数。 do read this question

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

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

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

    替代方案是initializeralso read

    【讨论】:

      【解决方案3】:

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

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

      More info 带有一般示例。

      【讨论】:

        【解决方案4】:

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

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

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

        如果Color 只有一个没有参数的构造函数,并且要让类“工作”,将调用setR 和其他方法...@ 987654321@类。

        【讨论】:

          【解决方案5】:

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

          【讨论】:

          • 可以通过委托给单个构造函数的多个工厂方法来做到这一点。但这可能是作弊;-)
          【解决方案6】:

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

          【讨论】:

          • 不需要总是提供默认构造函数。
          • 也可能不希望提供默认构造函数。
          • 如果没有默认构造函数..并且您的类被另一个类扩展..例如说您的类是没有默认构造函数的 A..B 类扩展了 A...在创建 B 类的对象时。如果你说 B b= new B();那么会发生什么?
          • 这取决于B的构造函数的实现。如果A没有默认构造函数,则由B的构造函数调用其超类的适当构造函数。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-02-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多