3.6 包和访问修饰符
包的概述
包(Package)是Java中用于组织类和接口的命名空间机制。通过使用包,可以:
- 避免命名冲突
- 提供更好的代码组织和模块化
- 控制访问权限(结合访问修饰符使用)
包的定义与使用
// 定义包
package com.example.mypackage;
// 导入其他包中的类
import java.util.ArrayList;
import java.util.List;
包命名规范
- 使用逆序的域名作为前缀(如:com.example)
- 全部小写字母
- 使用点号(.)分隔不同层级
- 避免使用Java保留字
访问修饰符
Java提供了四种访问控制级别:
| 修饰符 | 类内 | 同包 | 子类 | 其他包 |
|---|---|---|---|---|
| private | ✔ | ✖ | ✖ | ✖ |
| (default) | ✔ | ✔ | ✖ | ✖ |
| protected | ✔ | ✔ | ✔ | ✖ |
| public | ✔ | ✔ | ✔ | ✔ |
1. private
- 仅限当前类内部访问
- 常用于封装类的内部实现细节
private int secretValue;
private void internalMethod() {...}
2. 默认(包私有)
- 不使用任何修饰符时默认的访问级别
- 允许同一包内的其他类访问
class PackagePrivateClass {
int packagePrivateField;
void packagePrivateMethod() {...}
}
3. protected
- 允许同一包内的类和不同包中的子类访问
protected void parentMethod() {...}
4. public
- 完全公开,任何地方都可以访问
- 常用于API接口
public class PublicClass {
public static final String CONSTANT = "value";
public void publicMethod() {...}
}
最佳实践
- 优先使用最严格的访问级别(private > default > protected > public)
- 字段通常设为private,通过public方法提供访问
- 工具类的方法通常设为public static
- 避免使用protected字段,防止子类过度依赖父类实现
静态导入(static import)
允许直接使用静态成员而不需要类名前缀:
import static java.lang.Math.PI;
import static java.lang.Math.pow;
double area = PI * pow(radius, 2);
常见问题
- 循环依赖:避免包之间的循环引用
- 过度暴露:避免不必要地使用public修饰符
- 包膨胀:避免创建过大的包(建议每个包包含5-20个类)
总结
合理使用包和访问修饰符是Java面向对象设计的重要方面,它们共同构成了Java的封装机制,是构建可维护、可扩展软件系统的基础。
