对于方法的创建可将其想象成为自己写的每个类都调用一次initialize()这个名字提醒我们在使用对象之前应首先进行这样的调用但不幸的是这也意味着用户必须记住调用方法在Java中由于提供了名为构建器的一种特殊方法所以类的设计者可担保每个对象都会得到正确的初始化若某个类有一个构建器那么在创建对象时Java会自动调用那个构建器——甚至在用户毫不知觉的情况下所以说这是可以担保的! 接着的一个问题是如何命名这个方法存在两方面的问题第一个是我们使用的任何名字都可能与打算为某个类成员使用的名字沖突第二是由于编译器的责任是调用构建器所以它必须知道要调用是哪个方法C++采取的方案看来是最简单的且更有逻辑性所以也在Java里得到了应用构建器的名字与类名相同这样一来可保证象这样的一个方法会在初始化期间自动调用 下面是带有构建器的一个简单的类(若执行这个程序有问题请参考第章的赋值小节) //: SimpleConstructorjava // Demonstration of a simple constructor package c; class Rock { Rock() { // This is the constructor Systemoutprintln(Creating Rock); } } public class SimpleConstructor { public static void main(String[] args) { for(int i = ; i < ; i++) new Rock(); } } ///:~ 现在一旦创建一个对象 new Rock(); 就会分配相应的存储空间并调用构建器这样可保证在我们经手之前对象得到正确的初始化 请注意所有方法首字母小写的编码规则并不适用于构建器这是由于构建器的名字必须与类名完全相同! 和其他任何方法一样构建器也能使用自变量以便我们指定对象的具体创建方式可非常方便地改动上述例子以便构建器使用自己的自变量如下所示 class Rock { Rock(int i) { Systemoutprintln( Creating Rock number + i); } } public class SimpleConstructor { public static void main(String[] args) { for(int i = ; i < ; i++) new Rock(i); } } 利用构建器的自变量我们可为一个对象的初始化设定相应的参数举个例子来说假设类Tree有一个构建器它用一个整数自变量标记树的高度那么就可以象下面这样创建一个Tree对象 tree t = new Tree(); // 英尺高的树 若Tree(int)是我们唯一的构建器那么编译器不会允许我们以其他任何方式创建一个Tree对象 构建器有助于消除大量涉及类的问题并使代码更易阅读例如在前述的代码段中我们并未看到对initialize()方法的明确调用——那些方法在概念上独立于定义内容在Java中定义和初始化属于统一的概念——两者缺一不可 构建器属于一种较特殊的方法类型因为它没有返回值这与void返回值存在着明显的区别对于void返回值尽管方法本身不会自动返回什么但仍然可以让它返回另一些东西构建器则不同它不仅什么也不会自动返回而且根本不能有任何选择若存在一个返回值而且假设我们可以自行选择返回内容那么编译器多少要知道如何对那个返回值作什么样的处理 |