初心

何期自性,本自具足

构造函数

| Comments

  构造函数(constructor)是人们完成结构化程序设计的一个新概念。在OO设计语言中,构造函数就是与类名同名而且没有返回类型的方法。

  例如,Cabbie类的构造函数大致是:

1
2
3
public Cabbie(){
  //
}

  编译器会识别出这个方法名与类名相同,从而认为这个方法是一个构造函数。

构造函数没有返回值。如果为方法提供了一个返回值,编译器就不会把它作为一个构造函数。

何时调用构造函数

  创建一个新对象时,首先要做到事情之一就是调用构造函数。

1
Cabbie myCabbie = new Cabbie();

  会实例化一个Cabbie对象,并调用Cabbie方法。

构造函数中有什么

  构造函数中的代码应当将新创建的对象设置为其稳定、安全的初始状态。

  初始化属性是构造函数完成的一个常见功能。

默认构造函数

  至少存在一个构造函数,不论你自己是否编写了构造函数。如果你没有提供构造函数,系统也会为你提供一个默认的构造函数。例如,如果没有为Cabbie类提供一个构造函数,就会插入一下默认构造函数:

1
2
3
public Cabbie(){
  super();
}

  如果没有显式地继承另一个类,Object类就会成为父类。如果类中有属性,好的实践往往是初始化这些属性。

提供一个构造函数

一般经验是,总是应该提供一个构造函数,即使你不打算在其中做任何事情。可以先提供一个构造函数,其中不包含任何内容,等以后再补充,使用编译器提供的默认构造函数尽管从技术上讲没什么问题,但是最好能清楚地知道你的代码到底是怎样的。

重载构造函数

  有时可能希望传入一个初始化参数,这成为重载一个方法。

  重载适用于所有方法。重载允许程序员多次使用同一个方法名,只要每次方法的签名不同。签名由方法名和一个参数列表组成。

1
2
3
4
5
6
7
8
9
public class Count {
  int count;
  public Count(){
    count = 0;
  }
  public Count (int number){
    count = number;
  }
}

  在JAVA和C#,返回类型不是签名的一部分。只是返回类型不同的方法会冲突。

超类如何构造

  使用继承时,必须知道父类如何构造。要记住,使用继承时,会从父类继承一切。因此,必须非常清楚父类的所有数据和行为。不过,构造函数如何继承就不那么明显了。

  遇到new关键字并且分配了对象后,会完成以下几个步骤。

  1. 构造函数中首先要做的是调用该类的超类的构造函数。如果没有显式地调用超类构造函数,就会自动调用超类默认构造函数;不过可以从字节码查看这个代码。

  2. 然后初始化对象的各个类属性。这些属性都是类定义的属性(实例变量),而不是构造函数或其他方法中的属性(局部变量)。

  3. 然后执行构造函数中的其余代码。

构造函数的设计

  设计一个类时,好的时间是初始化所有属性。不要指望编译器来初始化属性。构造函数可以用来确保应用处于一种稳定的状态。例如,若将一个属性初始化为0,那么当想把它用作一个除法运算的除数时,可能会导致一个不稳定的应用。初始化为0并不总是最好的策略。

Comments