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)不可见"。