类与对象
classes、access-specifiers、static、final。
35 分钟
类与对象
java-oop 已引入类与构造器——本课聚焦 访问修饰符、static、final 与对象初始化顺序,写出边界清晰的领域类。
学习目标
- 用 public/protected/default/private 表达 API 边界
- 区分实例成员与 static 成员的使用场景
- 用 final 表达不可变字段与不可覆盖方法
访问修饰符
public class Lesson {
private final String slug;
private String title;
String summary; // 包私有:同包可见
protected int orderIndex; // 子类可见
public Lesson(String slug) {
this.slug = Objects.requireNonNull(slug);
}
public String slug() { return slug; }
}
| 修饰符 | 类 | 成员 |
|---|---|---|
| public | 任意包 | 任意包 |
| protected | 同包+子类 | 同包+子类 |
| default | 同包 | 同包 |
| private | 仅本类 | 仅本类 |
原则:字段尽量 private,通过方法暴露行为(见 jva-oop 封装进阶)。
static 与 final
public class TrackCatalog {
private static final Logger LOG = Logger.getLogger(TrackCatalog.class);
private static int instanceCount = 0;
private final String trackSlug;
private final List<Lesson> lessons = new ArrayList<>();
public TrackCatalog(String trackSlug) {
this.trackSlug = trackSlug;
instanceCount++;
}
public static int instanceCount() {
return instanceCount;
}
}
- static:属于类,不依赖实例;常量、工厂方法、计数器
- final 字段:构造后不可重新赋值 → 配合构造器注入
- final 方法:子类不可覆盖(类非 final 时)
- final 类:不可继承,如
String
初始化顺序
静态字段/静态块(类首次加载,一次)
→ 实例字段 / 实例初始化块
→ 构造器
public class Demo {
private final int x = initX();
private int initX() { return 42; }
}
练习
- 写一个
Track类:slug 为 final,lessons 为 private List,提供只读 视图