ad

阅读《Java核心技术》卷1 基础知识_更了解Java的奥妙_4.6 对象构造

admin 292 2023-10-25

【摘要】 本书摘自《Java核心技术》一书中第4章,第6节,作者是来自美国的凯·S.霍斯特曼(Cay S.Horstmann),由林琪、苏钰涵等译。

4.6 对象构造

前面已经学习了编写简单的构造器,可以定义对象的初始状态。但是,由于对象构造非 常重要,所以Java提供了多种编写构造器的机制。下面将详细介绍这些机制。

4.6.1 重载

有些类有多个构造器。例如,可以如下构造一个空的 StringBuilder对象:

var messages = new StringBuilder();

或者,可以指定一个初始字符串:

阅读《Java核心技术》卷1 基础知识_更了解Java的奥妙_4.6 对象构造

var todoList = new StringBuilder("To do:\n");

这种功能叫做重载 (overloading)。 如果多个方法(比如, StringBuilder构造器方法)有相 同的名字、不同的参数,便出现了重载。编译器必须挑选出具体调用哪个方法。它用各个方 法首部中的参数类型与特定方法调用中所使用的值类型进行匹配,来选出正确的方法。如果 编译器找不到匹配的参数,就会产生编译时错误,因为根本不存在匹配,或者没有一个比其 他的更好(这个查找匹配的过程被称为重载解析 (overloading resolution))。

4.6.2 默认字段初始化

如果在构造器中没有显式地为字段设置初值,那么就会被自动地赋为默认值:数值为0、 布尔值为false、对象引用为null。有些人认为依赖默认值的做法是一种不好的编程实践。确 实,如果不明确地对字段进行初始化,就会影响程序代码的可读性。

例如,考虑 Employee类。假定没有在构造器中指定如何初始化某些字段,默认情况下,

就会将 salary字段初始化为0,将 name和 hireDay字段初始化为null。

但是,这并不是一个好主意。如果此时调用getName方法或getHireDay方法,就会得到一 个null引用,这应该不是我们所希望的结果:

LocalDate h = harry.getHireDay();

int year = h.getYear();// throws exception if h is null

4.6.3 无参数的构造器

很多类都包含一个无参数的构造器,由无参数构造器创建对象时,对象的状态会设置为 适当的默认值。例如,以下是Employee类的无参数构造器:

public Employee()

name="";

salary =θ;

hireDay = LocalDate.now();

}

如果写一个类时没有编写构造器,就会为你提供一个无参数构造器。这个构造器将所 有的实例字段设置为默认值。于是,实例字段中的数值型数据设置为0,布尔型数据设置为 false,所有对象变量将设置为null。

如果类中提供了至少一个构造器,但是没有提供无参数的构造器,那么构造对象时如果 不提供参数就是不合法的。例如,程序清单4-2中的Employee类提供了一个简单的构造器:

public Employee(String n, double s, int year, int month, int day)

对于这个类,构造默认的员工就是不合法的。也就是说,调用

e = new Employee();

将会产生错误。

4.6.4 显式字段初始化

通过重载类的构造器方法,可以采用多种形式设置类的实例字段的初始状态。不管怎样 调用构造器,每个实例字段都要设置为一个有意义的初值,确保这一点总是一个好主意。

可以在类定义中直接为任何字段赋值。例如:

class Employee

private String name ="";

在执行构造器之前先完成这个赋值操作。如果一个类的所有构造器都希望把某个特定的 实例字段设置为同一个值,这个语法就特别有用。

初始值不一定是常量值。在下面的例子中,就是利用方法调用初始化一个字段。考虑以 下 Employee类,其中每个员工有一个id 字段。可以使用下列方式进行初始化:

class Employee

{

private static int nextId;

private int id = assignId();

private static int assignId()

int r = nextId;

nextId++;

return ri

}

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们 18664393530@aliyun.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:阅读《Java核心技术》卷1 基础知识_更了解Java的奥妙_3.10 数组
下一篇:阅读《Java核心技术》卷1 基础知识_更了解Java的奥妙_3.6.5 空串与 Null串
相关文章

 发表评论

暂时没有评论,来抢沙发吧~

×