4.6 对象构造
-
重载
有些类有多个构造器。
例如:
StringBuilder对象
StringBuilder messages = new StringBuilder();
或者, 可以指定一个初始字符串:
StringBuilder todoList = new StringBuilder("To do:\n");
这种特征叫做重载。有相同的名字,不同的参数。
重载解析:通过用各个方法给出的参数类型与特定的方法调用所使用的值类型进行匹c配出对应的方法。如未找到相应的方法,则会报错。
- 默认域初始化
如果在构造器中没有显式地给赋予初值,那么就会被自动地赋为默认值:数值为0,布尔值为false,对象引用为null。
- 无参数的构造器
很多类都包含一个无参的构造方法,对象由无参数构造函数创建时,其状态会设置为适当的默认值。
例如:
public Employee()
{
name = "";
salary = 0;
hireDay = LocalDate.now();
}
如未编写构造器,那么系统会提供一个无参数构造器。
- 显式域初始化
通过重载类的构造器方法,可以采用多种形式设置类的实例域的初始状态。
可以在类定义中,直接将一个值赋给任意域。
例如:
class Employee
{
private String name ="";
...
}
或者
class Employee
{
private static int nextld;
private int id = assignld();
...
private static int assignld()
{
int r = nextld;
nextld++;
return r;
}
...
}
- 参数名
- 调用另一个构造器
关键词this引用方法的隐式参数。
如果构造器的第一个语句形如this(…),这个构造器将调用同一个类中的另一个构造器。
例如:
public Employee(double s)
{
// calls Employee(String, double)
this("Employee #" + nextld, s);
nextld++;
}
- 初始化块
第三种初始化数据域的方法是 初始化块。
例如:
class Employee
{
private static int nextld;
private int id;
private String name;
private double salary;
// 初始化块
{
id = nextld;
nextld++;
}
}
调用构造器的具遗体处理步骤:
1.所有数据域初始化为默认值。
2.按照在类声明中出现的次序,依次执行所有域初始化语句和初始化块。
3.如果构造器第一行调用了第二个构造器,则执行第二个构造器主体。
4.执行这个构造器的主体。
4.7 包
Java允许使用包(package)将类组织起来。借助于包可以方便的组织自己的代码,并将自己的代码与别人提供的代码库分开管理。
- 类的导入
一个类可以使用所属包中的所有类,以及其他包中的公共类(public class)
例如:
java.time.LocalDate today = java.time.LocalDate.now();
简化:
import java.util.*;//import java.time.LocalDate;
LocalDate today = LocalDate.now();
- 静态导入
import语句不仅可以导入类,还增加了导入静态方法和静态域的功能。
例如:import static java.lang.System.*;//import static java.lang.System.out;
其就可以使用System类的静态方法和静态域,而不必加类名前缀:
out.println("Goodbye, World!"); //i.e., System.out
exit(0); //i.e.,System.exit
- 将类放入包中
要想将一个类放入包中,就必须将包的名字放在源文件的开头,包中定义类的代码之前。
例如:
package com.horstiann.corejava;//默认在默认包中
public class Employee
{
...
}
包作用域
4.8 类路径
类的路径必须与包名匹配。
类路径包括:基目录、当前目录、jar文件。
为了使类能够被多个程序共享,需要做到下面几点:
1.把类放到一个目录中,例如/home/user。
2.将jar文件放在一个目录中,例如:/home/user。
3.设置类路径(class path)。类路径是所有包含类文件的路径的集合。
- 设置类路径
采用-classpath选项指定类路径:
java -classpath /home/user/dassdir:.:/home/user/archives/archive.jar HyProg
或者
java -classpath c:\classdir:.:c:\archives\archive.jar MyProg
4.9 文档注释
注释的插入
JDK包含一个很有用的工具,叫做javadoc,它可以由源文件生成一个HTML文档。
javadoc实用应用从下面几个特性在抽取信息:
1.包
2.公共类与接口
3.公共的和受保护的构造器及方法
4.公共的和受保护的域
注释以/*开始,以/结束。
- 类注释
类注释必须放在import语句之后,类定义之前。
例如:
/**
* A{©code Card} object represents a playing card , such
* as "Queen of Hearts". A card has a suit (Diamond , Heart ,
* Spade or Club) and a value (1 = Ace , 2 . . . 10, 11 = Jack,
* 12 = Queen , 13 = King)
*/
public class Card
{
...
}
- 方法注释
每个方法注释必须放在所描述的方法之前。
@param变量描述
@return描述
@throws类描述
例如:
/**
* Raises the salary of an employee.
* @param byPercent the percentage by which to raise the salary (e.g. 10 means 10%)
* ©return the amount of the raise
*/
public double raiseSal ary(double byPercent)
{
double raise = salary * byPercent / 100;
salary += raise;
return raise;
}
- 域注释
只需要对公有域建立文档。
例如:
/**
* The "Hearts" card suit
*/
public static final int HEARTS = 1;
- 通用注释
@author 作者
@version 版本
@since 始于 例如:@since version 1.7.10
@deprecated
@see 例如:
@see com.horstraann.corejava.Employee#raiseSalary(double) 方法的超链接
@see <a href="mmm.horstmann.com/corejava.html">The Core Java home page</a> 任意超链接
- 包与概述注释
要想产生包注释,就需要在每一个包目录中添加一个单独的文件。
1.提供一个以package.html命名的HTML文件。
2.提供一个以paskage-info.java命名的java文件。
- 注释的抽取
假设HTML文件将被存放在目录docDirectory下。其步骤为:
1.切换到包含想要生成文档的源文件目录。
2.如果是一个包,运行:
javadoc -d docDirectory nameOfPackage
4.10 类设计技巧
技巧:
1.一定要保证数据私有。
2.一定要对数据初始化。
3.不要再类中使用过多的基本类型。
4.不是所有的域都需要独立的域访问器和域更改器。
5.将职责过多的类分解。
6.类名和方法名要能够提现他们的职责。
7.优先使用不可变的类。