Excel 名称框概述-英雄云拓展知识分享
292
2023-10-25
【摘要】 本书摘自《Java核心技术》一书中第4章,第6节,作者是来自美国的凯·S.霍斯特曼(Cay S.Horstmann),由林琪、苏钰涵等译。
4.6 对象构造
前面已经学习了编写简单的构造器,可以定义对象的初始状态。但是,由于对象构造非 常重要,所以Java提供了多种编写构造器的机制。下面将详细介绍这些机制。
4.6.1 重载
有些类有多个构造器。例如,可以如下构造一个空的 StringBuilder对象:
var messages = new StringBuilder();
或者,可以指定一个初始字符串:
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小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~