java中抽象类配合包访问权限实现模块内部框架封装,核心是限制暴露、控制继承、隔离实现:抽象类设为default仅包内可见,子类用default或protected控制使用范围,关键钩子方法用protected abstract,模板方法用public final封死,对外仅暴露门面类。

抽象类本身不对外暴露,只在包内可见
把抽象类声明为 default 权限(即不写任何修饰符),它就只能被同一个包下的类访问。外部包即使继承该抽象类也会编译失败——这天然形成一道边界,防止非本模块代码随意继承或依赖。
例如:
// com.example.pay.core 包下
abstract class PaymentProcessor { // 没有 public,仅本包可见
protected abstract void doValidate();
protected abstract void doExecute();
public final void execute() {
doValidate();
doExecute();
}
}
这样,PaymentProcessor 就成了模块内部的骨架,外部调用方只能看到 execute() 这个 public 方法,看不到也不需要知道子类怎么验证、怎么执行。
具体实现类用 default 或 protected,限制使用范围
子类实现不必对外公开,它们是模块内部的“插件”:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 若子类仅用于本包内组合或测试,直接用 default(如
AlipayProcessor); - 若需支持跨包继承(比如提供给下游模块做定制),则用 protected 修饰构造器,并保持类为 public ——但注意:protected 构造器 + public 类,仍允许同包子类或不同包子类继承,只是不能直接 new;
- 不建议把具体实现类设为 public 并暴露给所有包,否则会破坏封装边界。
关键方法用 protected 控制子类可重写点
抽象类中定义的模板方法(如 execute())用 public final 封死,确保流程不可篡改;而留给子类定制的钩子方法,则统一用 protected abstract:
- 子类必须实现这些方法,保证框架契约;
- protected 允许同包子类和跨包子类访问,满足继承需求;
- 外部包无法调用这些 protected 方法,也无法绕过模板直接触发业务逻辑。
这种设计让“什么能变、什么不能变”一目了然,既开放扩展点,又守住主干流程。
配套 package 和 import 管理调用入口
对外只暴露一个 public 的门面类或接口,放在模块顶层包(如 com.example.pay.PaymentService),它内部通过 package-private 抽象类协调各组件:
- 调用方只需 import
com.example.pay.*或具体门面类; - 不需要、也不应该 import
com.example.pay.core.*下的抽象类或实现类; - 模块内部通过同包访问自然协作,无需 public 泛滥,也避免了反射或强转绕过封装。
这才是真正“模块内部的框架封装”:抽象类是骨架,包权限是围墙,protected 是授权通道,default 是默认守则。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










