我对Java非常陌生,并且试图学习这个主题,因为之前的程序设计暴露在HTML/CSS中。我已经开始与赫伯特Schildt并通过几页进展。构造函数重载的优点
我无法理解构造函数重载的确切优点。使用单个构造函数重载方法来实现灵活性不是更容易吗?此外,如果我试图使用构造函数重载来使用一个对象来初始化另一个对象,那么有更简单的方法来做到这一点!那么,我应该使用构造函数重载的好处是什么?
我对Java非常陌生,并且试图学习这个主题,因为之前的程序设计暴露在HTML/CSS中。我已经开始与赫伯特Schildt并通过几页进展。构造函数重载的优点
我无法理解构造函数重载的确切优点。使用单个构造函数重载方法来实现灵活性不是更容易吗?此外,如果我试图使用构造函数重载来使用一个对象来初始化另一个对象,那么有更简单的方法来做到这一点!那么,我应该使用构造函数重载的好处是什么?
构造超载是用于模拟的默认值是非常有用的,或从一个已经存在的实例(复制)构造一个对象
下面是一个例子:
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
从任何构造函数递增。
它完全取决于你如何构建你的对象。
构造函数重载的经典示例之一是Java中的ArrayList。 ArrayList有三个构造函数,一个是空的,另一个是一个集合对象,一个是初始容量。这些重载构造函数允许灵活性创建数组列表对象。在创建过程中,你可能不知道arraylist的大小,你可以简单地使用默认的无参数构造函数,但如果你知道大小,那么最好使用带有容量的重载构造函数。由于ArrayList也可以从另一个Collection创建,因此可能来自另一个List,而不是另一个重载的构造函数。通过使用重载的构造函数,可以将ArrayList转换为Set或任何其他集合。
More info带有一般示例。
构造函数的定义方式将确保构造函数的参数在实例化时传递给对象。
重载方法不会“强制”任何人调用它,而不像在构造函数中有参数那样,你不能在不传递这些参数的情况下实例化一个对象。
在ndj的答案中,可以用四种不同的方法创建多种方法来构造一个对象,例如Color
类。每种方法都确保Color
作为有用的最小信息或“工作”。
这些信息可以和失踪如果Color
只有无参数构造器,为类“工作”,将调用setR
和其他方法......这不会在Color类存在。
您可能在一个类中有多个变量......但是您只想在创建对象时初始化少数(一个或两个)变量。 因此,在这种情况下,总是有更好的重载构造函数,以便您可以调用各自的构造函数取决于您的要求。 有一件事你应该永远记住,..重载构造函数总是提供一个默认的构造函数(零参数构造函数)。
有没有必要**总是**提供一个默认的构造函数。 – proskor
它可能也不是**希望提供一个默认的构造函数。 –
如果没有默认构造函数..并且你的类被另一个类扩展..例如说ur类是A,它没有默认构造函数。类B扩展A ...在创建类B的对象时如果你说B b = new B();那么会发生什么? – user2714918
考虑构造函数重载的最简单的例子:
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)和构造函数来创建对象将在长远帮助,也使你的类更可用到你的队友
而且,如果我想使用的构造函数重载使用一个 对象来初始化另一个,有更简单的方法来做到这一点!
很好的问题! –
谈到Java时,Schildt的声誉有什么好处?我记得当他试图编写有关C和C++的书籍时,他基本上是一个笑柄... – cHao
Schildt的Java书很好..不知道C和C++的书。这本Java书从非常基础的开始。因此,对于OOP和Java新手来说,这真的很有启发。 –