您所在的位置:主页 > 培训巧问答 >

什么是构造函数

时间:2014-11-22 17:21来源:未知 作者:疯狂java 点击:

  

  什么是构造函数

  如果类中定义了大量的属性,在实例化类的对象后,往往需要挨个为属性赋值,上一个例子中的Birthday类,创建对象后需要分别为year、month、day三个属性赋值。为了减少不必要的重复,Java提供了构造函数这一特殊的方法来进行对象的初始化工作。构造函数有如下语法特征:

  1. 构造函数不能定义返回值类型。

  2. 构造函数名必须与类名相同。

  3. 构造函数无法手工调用,只有在实例化对象时由系统自动调用。

  4. 构造函数可以重载,Java会根据实例化对象时传递的参数决定调用哪一个构造函数。

  5. 没有参数的构造函数称为缺省构造函数,Java编译器会为类生成缺省构造函数,但如果开发者自己定义了构造函数(无论是否有参数),编译器将不再生成缺省构造函数。

  下例演示了构造函数的各种语法:

  class CA {

  private int a;

  private String b;

  public CA() {

  }

  public CA(int a) {

  this.a = a;

  }

  public CA(int a, String b) {

  this.a = a;

  this.b = b;

  }

  public void print() {

  System.out.println("a = " + a + ", b = " + b);

  }

  }

  class CB {

  public CB(int anything) {

  }

  }

  public class Constructor {

  public static void main(String[] args) {

  CA c1 = new CA(); //调用CA()

  CA c2 = new CA(10); //调用CA(int a)

  CA c3 = new CA(20, "hehe"); //调用CA(int a, String b)

  CB c4 = new CB(); //出错

  CB c5 = new CB(10); //调用哪个CB(int anything)

  }

  }

  因为构造函数不能手工调用,为了防止构造函数重载过程中产生的代码冗余,需要在特殊构造函数通过this关键字委托给一般构造函数,注意通过this委托的代码必须处于构造函数的上一行,如下所示:

  class Man {

  private String name;

  private int age;

  public Man() {

  this("Tom");

  }

  public Man(String name) {

  this(name, 20);

  }

  public Man(String name, int age) {

  this.name = name;

  this.age = age;

  }

  }

  最后需要消除对构造函数的一个误解,大部分开发者会认为构造函数会是对象中第一段被执行的代码,但实际上并非如此,如下所示:

  class OA {

  public OA() {

  System.out.println("OA");

  }

  }

  class OB {

  OA oa = new OA();

  public OB() {

  System.out.println("OB");

  }

  }

  public class ConstructorOrder {

  public static void main(String[] args) {

  new OB();

  }

  }

  观察输出结果可知,在类的构造函数执行前,会先对属性执行初始化操作。所以打印结果先是OA,才是OB。