Java 设计者认为:类要么完全公开(public),要么只在这个模块(包)内内部使用(default)。如果需要限制继承,可以在类内部通过构造函数或 final 关键字控制,而不是在类定义级别使用 protected。
3.3 对比表
特性
外部类 (Top-level)
内部类 (Inner)
可用修饰符
public , default
public , protected , private , default
文件对应
文件名必须与 public 类名一致
无独立文件,依附于外部类
访问范围
全局 或 包内
可精确控制到外部类的实例或静态上下文
设计目的
构建模块的对外接口或内部实现
封装逻辑,回调,事件监听
4. 最佳实践:构建清晰的 Java 项目结构
基于上述原理,我们在实际开发中应遵循以下规范:
4.1 目录结构规范
严格遵守包名与目录一致的原则。
1 2 3 4 5 6 7 8 9 10
src/main/java └── com └── example ├── Application.java // public class Application ├── controller │ └── UserController.java // public class UserController └── service ├── UserService.java // public class UserService └── impl // 存放实现细节 └── UserServiceImpl.java
4.2 类的设计原则
单一职责:一个文件只专注于一个 public 类的定义。如果有辅助类,可以考虑:
定义为单独的 .java 文件(使用 default 访问权限,仅限包内使用)。
定义为 static 内部类(如果它紧密依赖于外部类)。
最小暴露原则:
对外提供的 API、DTO、Service 接口使用 public。
内部工具类、实现细节、数据传输对象(如果不跨包)尽量使用 default,减少 public 类的数量,降低耦合。
A ────────────────┐ ├──[AND]──┐ B ────────────────┤ │ ├──[OR]───┤ ├──[XOR]──┼── MUX ──→ Result ├──[ADD]──┤ Control Signal ──→[SEL]─────┘ 控制信号(如 ALUOp) 决定 MUX 选择哪一路输出 减法通过补码实现: A - B = A + (-B) = A + (\sim B + 1)
若 (A = 0),则 (\overline{A} = 1);若 (A = 1),则 (\overline{A} = 0)。
德·摩根的核心思想:
“A 或 B 不成立” ⇔ “A 不成立 且 B 也不成立”
“A 与 B 不成立” ⇔ “A 不成立 或 B 不成立”
电路意义:可用 NOT + AND 实现 NOR,体现门电路的等价性。
吸收律(Absorption Law)
[ \begin{aligned} A + A \cdot B &= A \ A \cdot (A + B) &= A \end{aligned} ]
【Q&A】吸收律为什么成立?怎么推导? 1. 真值表验证:无论 B 取何值,(A + AB) 的结果始终等于 A。 2. 代数推导: [ A + AB = A \cdot 1 + A \cdot B = A(1 + B) = A \cdot 1 = A ] (因为 (1 + B = 1) 在布尔代数中恒成立) 3. 电路意义:当 A 已确定输出时,额外的 (AB) 路径不影响结果,被“吸收”。 → 这是逻辑简化的重要工具!