4.3.1 Employee 类

一个源文件中只能有一个 public 类.

  1. package chapter04;
  2. import java.time.LocalDate;
  3. public class Employee {
  4. private String name;
  5. private double salary;
  6. private LocalDate hireDay;
  7. public Employee(String n, double s, int year, int month, int day) {
  8. name = n;
  9. salary = s;
  10. hireDay = LocalDate.of(year, month, day);
  11. }
  12. public String getName() {
  13. return name;
  14. }
  15. }

4.3.2 多个源文件的使用

使用通配符编译多个源文件:

  1. $ javac Employee*.java

自动寻找 Employee.java 文件:

  1. $ javac EmployeeTest.java

4.3.3 剖析 Employee 类

4.3.4 从构造器开始

4.3.5 使用 var 声明局部变量

  1. 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 基于类的访问权限

一个方法可以访问所属类的所有对象的私有数据:

  1. public class Main {
  2. public static void main(String[] args) {
  3. Employee employee1 = new Employee("abc", 123.03, 2021, 4, 28);
  4. Employee employee2 = new Employee("def", 123.03, 2021, 4, 28);
  5. employee1.PrintOtherEmployee(employee2); // def
  6. }
  7. }
  8. public class Employee {
  9. private String name;
  10. private double salary;
  11. private LocalDate hireDay;
  12. public Employee(String n, double s, int year, int month, int day) {
  13. name = Objects.requireNonNull(n, "The name cannot be null");
  14. salary = s;
  15. hireDay = LocalDate.of(year, month, day);
  16. }
  17. public String getName() {
  18. return name;
  19. }
  20. public void PrintOtherEmployee(Employee other) {
  21. System.out.println(other.name);
  22. }
  23. }

4.3.10 私有方法

  • 辅助方法不应该是公开的

4.3.11 final 实例字段

  • final 字段在构造时初始化
  • 对于 final 的对象字段, 表示该字段不会引用其他对象
  1. private final StringBuilder evaluations;
  2. public void giveGoldStar() {
  3. // final 的 evaluations 所引用的对象本身是可以改变的,
  4. // evaluations 不能再引用其他对象.
  5. evaluations.append(LocalDate.now() + ": Gold star!\n");
  6. }