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");}
