2013-08-26 130 views
6

我对Java非常陌生,并且试图学习这个主题,因为之前的程序设计暴露在HTML/CSS中。我已经开始与赫伯特Schildt并通过几页进展。构造函数重载的优点

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

+0

很好的问题! –

+0

谈到Java时,Schildt的声誉有什么好处?我记得当他试图编写有关C和C++的书籍时,他基本上是一个笑柄... – cHao

+0

Schildt的Java书很好..不知道C和C++的书。这本Java书从非常基础的开始。因此,对于OOP和Java新手来说,这真的很有启发。 –

回答

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

0

当你正在处理immutable classes,你想提供多种方式来实例化它们,那么重载构造函数很方便。

+1

你可以用多个工厂方法来委托给一个构造函数。但这可能会作弊;-) –

1

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

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

More info带有一般示例。

1

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

重载方法不会“强制”任何人调用它,而不像在构造函数中有参数那样,你不能在不传递这些参数的情况下实例化一个对象。

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

这些信息可以和失踪如果Color只有无参数构造器,为类“工作”,将调用setR和其他方法......这不会在Color类存在。

0

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

+1

有没有必要**总是**提供一个默认的构造函数。 – proskor

+0

它可能也不是**希望提供一个默认的构造函数。 –

+0

如果没有默认构造函数..并且你的类被另一个类扩展..例如说ur类是A,它没有默认构造函数。类B扩展A ...在创建类B的对象时如果你说B b = new B();那么会发生什么? – user2714918

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