4.3.1 Employee 类
一个源文件中只能有一个 public 类.
package chapter04;
import java.time.LocalDate;
public class Employee {
private String name;
private double salary;
private LocalDate hireDay;
public Employee(String n, double s, int year, int month, int day) {
name = n;
salary = s;
hireDay = LocalDate.of(year, month, day);
}
public String getName() {
return name;
}
}
4.3.2 多个源文件的使用
使用通配符编译多个源文件:
$ javac Employee*.java
自动寻找 Employee.java 文件:
$ javac EmployeeTest.java
4.3.3 剖析 Employee 类
4.3.4 从构造器开始
4.3.5 使用 var 声明局部变量
var harry = new Employee("harry Hacker", 50000, 1989, 10, 1);
4.3.6 使用 null 引用
定义一个类时, 最好清楚地知道哪些字段可能为 null.
在 String 变量为 null 时为其赋值:
- 宽容型:
name = Objects.requireNonNullElse(n, "unknown");
- 严格型:
name = Objects.requireNonNull(n, "The name cannot be null");
- 会抛出异常
4.3.7 隐式参数与显式参数
- 隐式参数指类似 Go 中的接收器, 在 Java 中用 this 来表示
- 显式参数就是方法的参数类表
4.3.8 封装的优点
- 使用访问器或修改器将字段与使用者解耦
- 访问器不要返回可变对象 (或实例字段本身的引用, 避免被更改)
- 应使用 clone
4.3.9 基于类的访问权限
一个方法可以访问所属类的所有对象的私有数据:
public class Main {
public static void main(String[] args) {
Employee employee1 = new Employee("abc", 123.03, 2021, 4, 28);
Employee employee2 = new Employee("def", 123.03, 2021, 4, 28);
employee1.PrintOtherEmployee(employee2); // def
}
}
public class Employee {
private String name;
private double salary;
private LocalDate hireDay;
public Employee(String n, double s, int year, int month, int day) {
name = Objects.requireNonNull(n, "The name cannot be null");
salary = s;
hireDay = LocalDate.of(year, month, day);
}
public String getName() {
return name;
}
public void PrintOtherEmployee(Employee other) {
System.out.println(other.name);
}
}
4.3.10 私有方法
- 辅助方法不应该是公开的
4.3.11 final 实例字段
- final 字段在构造时初始化
- 对于 final 的对象字段, 表示该字段不会引用其他对象
private final StringBuilder evaluations;
public void giveGoldStar() {
// final 的 evaluations 所引用的对象本身是可以改变的,
// evaluations 不能再引用其他对象.
evaluations.append(LocalDate.now() + ": Gold star!\n");
}