Java构造函数

时间:2020-01-09 10:34:48  来源:igfitidea点击:

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