constructor消除了类代码多的问题,使代码更容易阅读。 举个例子,在前面的代码片段中,
你并没有看到一个某种概念化的和对象创建分离开的initialize()方法被明确调用。 在Java里,
对象创建和对象初始化是合二为一的概念——你不能将它们分离开来使用。
constructor是一类特殊类型的方法,因为它没有返回值。 没有返回值和void返回值是截然不
同的,含有void返回值的方法不返回任何东西,但是你仍然有让该方法返回别的什么的选择余地。
constructor不返回任何东西并且你也没有要返回别的什么的选择余地(使用 new 表达式确实返回
了一个对新创建对象的引用,但是constructor自身没有返回值)。 假如有返回值,你也因此能够
按照自己的意愿指定返回值,编译器就有必要知道如何处置那个返回值。
练习1: (1)创建一个类,该类包含有一个未初始化的String引用。 用该类来证明引用被Java
初试化为null。
练习2: 创建一个类,该类包含一个在定义时就初始化的String field和另一个通过constructor
来初始化的String field。 这两种初始化的途径有什么不同?
Method overloading
名称的使用是任何编程语言的一个重要特征。 当你创建了一个对象,你就为对应的内存区域指
定了一个名称。 方法的名称暗示着方法对应的行为。 你通过使用名称引用任何对象和方法。 经过
选择的合适的名称会构成一个人们易于阅读和改变的名称体系。 这非常像写散文——目标就是和你
的读者交流。
当把人类语言所能表达的具有细微差别的概念转换成编程语言时,会产生一个问题。 在人类语
言中,同样一个词经常可以表达一些不同的意思——这叫做overloaded。 这种表达方式是有用的,
尤其是当表达细微的区别时。 你会说,“洗衬衫”,“洗汽车”,“洗狗”。 但是你仅仅为了让
听者不必区别具体做了什么事情而强迫自己说,“用洗衬衫的方式洗衬衫”,“用洗汽车的方式洗
汽车”,“用洗狗的方式洗狗”,那就太无聊了。 大多数人类语言所表达的意思都是丰富的,所以
即便你没用一些词,你仍然能够表达清楚意思。 你不需要独特的标志符——你能从上下文推断言语
的意思。
但是大多数编程语言(尤其是C)要求你为每一个方法都设置独特的标志符(在那些编程语言里
方法通常被称为函数)。 因此不允许你拥有一个打印integers的print()函数,同时拥有另一个
打印floats的print()函数——每一个函数要求有一个有别于其它函数的名字。
在Java(和C++)里,另一个因素促成了方法名称的overloading: the constructor。 因为
constructor的名称由类的名称决定,所以只能有一个预定的名字。 但是如果你想以多种方式初始
化对象,该怎么办呢? 举个例子,设想你创建了一个类,那个类既能以通常的方式初始化自己也可
以通过读取文件里的信息来初始化。 那你就需要两个constructor,一个是default constructor,
另一个是将String作为参数的constructor,String就是用来初始化对象的文件的名字。 由于两个
评论2
最新资源