最近在 CSDN 论坛中看到有人问为什么不能在类的方法中调用 constructor,之后跟贴若干。
其实这个问题的答案可以简单的概括成为一句话:构造器不是类的成员(constructors are not members of class1)。
类似于方法,构造器可以拥有一个参数列表,但是和方法不同的是构造器没有返回类型;类似于方法,我们可以为构造器指定访问限定符,但是和方法不同的是即使构造器的访问限定符是 public、protected、package,构造器依然不会为子类所继承。
考虑如下代码:
class SomeClass {
private String str = “I’m a ”;
public SomeClass() {
System.out.println(str + “constructor.”);
}
public void SomeClass() {
System.out.println(str + “method.”);
}
}
class SomeClassTest {
public static void main(String[] args) {
SomeClass sc = new SomeClass(); // invoke the constructor
sc.SomeClass(); // invoke the method
}
}
我们可以从上面的代码中可以看到,虽然构造器和方法具有相同的名字和参数列表,但是它们之间并不会发生冲突,因为 Java 语言是把它们当作不同的东西来看待的。
在 Java 中,我们只有两种途径可以调用构造器,一条途径是通过 new 关键字,另外一条途径是在构造器中使用 this() 来调用其它构造器。在调用 this() 的时候,需要将 this() 放在构造器代码体中的第一行作为第一条语句。这样做主要是基于如下两个原因:首先,我们不能针对一个已经分配了内存的元素调用构造器;其次,在系统开始执行构造器中的语句的时候,内存已经被分配了2。同时需要注意的是,一、this() 只能在构造器中使用,而不能在方法中使用;二、this() 在同一个构造器中只能被调用一次;三、在 this() 调用中的所使用的所有用于参数的表达式都不能够引用当前对象的任何字段和方法;四、任何在 this() 调用之后的代码,将在 this() 所调用的另一个构造器完全运行完毕之后才能被执行。
1. Ken Arnold, James Gosling, David Holmes,《Java 编程语言(第三版·影印版)》,44页。
2. Peter van der Linden, 《Java 2 教程(第五版)》,25页。