Java构造函数
Java中的构造方法是一种特殊的方法,在创建对象时会自动调用该方法来初始化对象。
需要构造函数
创建对象时,初始化该对象(为其实例变量提供值)是非常普遍的要求。为了方便提供构造函数,Java在创建对象以保证初始化时自动调用该构造函数。
Java构造函数示例
public class ConstructorDemo {
int num;
String name;
public ConstructorDemo(int num, String name){
this.num = num;
this.name = name;
}
public static void main(String[] args) {
ConstructorDemo cd = new ConstructorDemo(10, "Rodrigo");
System.out.println("Number is " + cd.num + " Name is " + cd.name);
}
}
输出:
Number is 10 Name is Rodrigo
在上面的代码中,构造函数的定义如下,它是一个参数化的构造函数(带参数的构造函数)。
public ConstructorDemo(int num, String name){
this.num = num;
this.name = name;
}
使用new()运算符创建该类的对象时,在new运算符完成对象创建之前,将自动调用构造函数以初始化该对象。
构造规则
由于Java中的构造函数是一种特殊方法,因此其用法受以下特殊规则支配。
构造函数与该类具有相同的名称,因此Java可以识别该构造函数并自动调用它。
构造函数的返回类型甚至都不是void。这就是构造函数与常规方法的不同之处。如果指定了返回类型,则不会将其视为构造函数,而是常规方法。
Java中的构造函数可以具有public,protected,默认(package-private)或者private访问修饰符。
Java中的构造函数不能是最终的。试图使构造函数最终产生编译时错误"类型非法的构造函数;只允许公开,受保护和私有"
构造函数的类型
Java中的构造方法可以有两种类型:
无参数构造函数–没有参数的构造函数。如果我们未在类中提供构造函数,则Java本身会隐式插入默认的无参数构造函数。
参数化构造函数–带有参数的构造函数。如果我们在类中明确指定了构造函数,则不会隐式插入默认的no-arg构造函数。
无参数构造函数示例
public class ConstructorDemo {
public static void main(String[] args) {
ConstructorDemo cd = new ConstructorDemo();
}
}
在这里,当创建对象时ConstrucorDemo cd = new ConstrucorDemo();默认的无参数构造函数被调用。
参数化构造函数
public class ConstructorDemo {
int num;
String name;
public ConstructorDemo(int num, String name){
this.num = num;
this.name = name;
}
public static void main(String[] args) {
ConstructorDemo cd = new ConstructorDemo(10, "Rodrigo");
System.out.println("Number is " + cd.num + " Name is " + cd.name);
//This will call no-arg constructor - ERROR
ConstructorDemo cd1 = new ConstructorDemo();
}
}
此代码将导致编译时错误–"构造函数ConstrucorDemo()未定义"。由于已经提供了参数化的构造函数,因此在这种情况下不提供默认的no-arg构造函数。
如果在这种情况下也需要no-arg构造函数,则必须显式编写它。同一类中可以有多个构造函数,在Java中这被称为构造函数重载。
public class ConstructorDemo {
int num;
String name;
// Parameterized constructor
public ConstructorDemo(int num, String name){
this.num = num;
this.name = name;
}
// no-arg constructor
public ConstructorDemo(){
}
public static void main(String[] args) {
ConstructorDemo cd = new ConstructorDemo(10, "Rodrigo");
System.out.println("Number is " + cd.num + " Name is " + cd.name);
//This will call no-arg constructor
ConstructorDemo cd1 = new ConstructorDemo();
}
}
Java中的私有构造函数
类中的构造函数也可以具有私有访问修饰符,在这种情况下,构造函数仅在创建的类中可见,因此其他任何类都无法创建该类的实例。这有助于控制类的实例化。我们可以看到使用私有构造函数的一种类设计是Singleton设计模式,我们可以在其中控制类的实例化,以使该类只有一个实例。
Java中的私有构造函数示例
public class ConstructorDemo {
int num;
String name;
// Parameterized constructor
private ConstructorDemo(int num, String name){
this.num = num;
this.name = name;
}
public static void main(String[] args) {
ConstructorDemo cd = new ConstructorDemo(10, "Rodrigo");
System.out.println("Number is " + cd.num + " Name is " + cd.name);
}
}
当在同一类中创建对象时cd = new ConstructorDemo(10," Rodrigo");那没问题。
但是尝试从任何其他类创建ConstructorDemo类的对象会导致错误"构造函数ConstructorDemo(int,String)不可见"。

