java
复制
下载
// 定义包 (必须位于文件首行) package com.example.vehicle; public class Car { // 类实现... }
三大核心价值:
避免命名冲突:相同类名在不同包中可共存
访问控制:与权限修饰符协同实现封装
模块化管理:逻辑相关的类组织在一起
bash
复制
下载
# 标准项目结构 src └── com └── company └── project ├── service ├── dao └── model
命名示例:
公司域名:company.com
→ 包前缀:com.company
项目名:ecommerce
→ 完整包名:com.company.ecommerce
java
复制
下载
// 单类导入 import java.util.ArrayList; // 全包导入(谨慎使用) import java.util.*; // 静态导入(简化工具类调用) import static java.lang.Math.PI; // 解决同名类冲突 import com.project1.Car; import com.project2.Car; public class Test { com.project1.Car car1; // 全限定名调用 }
修饰符 | 同类 | 同包 | 子类 | 跨包 |
---|---|---|---|---|
public |
✅ | ✅ | ✅ | ✅ |
protected |
✅ | ✅ | ✅ | ❌ |
默认 (无修饰符) |
✅ | ✅ | ❌ | ❌ |
private |
✅ | ❌ | ❌ | ❌ |
java
复制
下载
public class BankAccount { private double balance; // 完全封闭的私有字段 // 通过public方法控制访问 public void deposit(double amount) { if(amount > 0) balance += amount; } private boolean isValidAmount(double amt) { return amt > 0; // 私有工具方法 } }
java
复制
下载
// 文件: com/utils/StringHelper.java package com.utils; class StringHelper { // 默认修饰符:仅包内可见 static String trimAll(String s) { return s.replaceAll("\\s+", ""); } } // 同包类可访问 package com.utils; public class Demo { public static void main(String[] args) { String s = StringHelper.trimAll(" a b c "); // 合法 } }
java
复制
下载
package com.animals; public abstract class Animal { protected int age; // 子类可直接访问 protected void breathe() { // 子类可重写 System.out.println("呼吸中..."); } } package com.animals.domestic; import com.animals.Animal; public class Dog extends Animal { public void showAge() { System.out.println(age); // 可访问protected字段 } @Override protected void breathe() { super.breathe(); System.out.println("狗式呼吸法"); } }
java
复制
下载
// 文件: com/api/Logger.java package com.api; public interface Logger { // 全局服务接口 void log(String message); } // 跨包实现 package com.service; import com.api.Logger; public class FileLogger implements Logger { @Override public void log(String msg) { System.out.println("[FILE] " + msg); } }
bash
复制
下载
# 电商系统典型包结构 src ├── com │ └── ecommerce │ ├── controller # 公开API (public) │ ├── service # 业务逻辑 (protected/default) │ ├── dao # 数据访问 (default) │ ├── model # 领域对象 (public) │ ├── util # 工具类 (public/private) │ └── exception # 异常体系 (public)
java
复制
下载
// 服务接口 (公开) package com.service; public interface PaymentService { void pay(BigDecimal amount); } // 实现类 (包内可见) package com.service.impl; import com.service.PaymentService; class AlipayService implements PaymentService { @Override public void pay(BigDecimal amt) { // 支付宝支付实现 } } // 通过工厂暴露服务 package com.service; public class PaymentFactory { public static PaymentService getPaymentService() { return new AlipayService(); // 跨包返回实现类 } }
java
复制
下载
// 模块描述文件 module com.ecommerce.core { exports com.ecommerce.api; // 导出公共API包 exports com.ecommerce.model; requires java.sql; // 声明依赖 requires com.logging; opens com.ecommerce.internal; // 允许反射访问 }
java
复制
下载
// 反模式:过度公开 public class User { public String password; // 致命错误! } // 正确做法 public class User { private String password; public void setPassword(String pwd) { if(isValidPassword(pwd)) { this.password = encrypt(pwd); } } private boolean isValidPassword(String pwd) {...} private String encrypt(String pwd) {...} }
java
复制
下载
// 服务接口 public interface UserService { User getUserById(int id); void updateUser(User user); } // 管理接口(扩展服务) public interface AdminUserService extends UserService { void deleteUser(int id); ListlistAllUsers(); } // 实现类 class UserServiceImpl implements AdminUserService { // 实现所有方法 }
java
复制
下载
// 包私有构造器 + 工厂方法 public class DatabaseConfig { // 禁止外部实例化 DatabaseConfig() {} // 工厂方法控制实例化 public static DatabaseConfig create() { return new DatabaseConfig(); } }
java
复制
下载
// 文件1: com/utils/Validator.java package com.utils; class Validator { // 默认访问权限 static boolean isEmail(String s) { ... } } // 文件2: com/utils/App.java package com.utils; // 必须在同一包 public class App { void test() { Validator.isEmail("[email protected]"); // 可访问 } }
java
复制
下载
// 父类: package p1 public class Parent { protected int value; // 允许子类访问 } // 子类: package p2 public class Child extends Parent { void test() { System.out.println(value); // ✔ 子类中直接访问 Parent p = new Parent(); System.out.println(p.value); // ✘ 编译错误!跨包不能访问实例成员 } }
java
复制
下载
// 模块A module A { exports com.a.api; } // 模块B module B { requires A; // 只能访问com.a.api包内容 }
设计场景 | 推荐方案 |
---|---|
领域模型定义 | public class + private字段 |
工具类实现 | public final class + private构造器 |
服务接口 | public interface |
内部实现细节 | 默认访问权限(包私有) |
可扩展的基类 | protected 方法/字段 |
跨模块API | 模块导出(exports ) |
封装三定律:
所有字段默认
private
方法按需开放(从
private
开始逐步放宽)类优先使用包级访问,必要时再
public