默认访问权限的基本概念
在Java中,如果一个类成员(包括属性、方法、构造器等)没有显式添加任何访问权限修饰符,就会被赋予默认访问权限,也常被称为包访问权限。默认访问权限的核心作用范围是当前类所在的同一个包,同包下的其他类可以直接访问该成员,而不同包的类则无法直接访问。

默认访问权限不需要额外的关键字声明,这是它和其他访问权限最明显的区别。比如我们定义一个没有修饰符的属性和方法,就自动具备了默认访问权限:
// 定义一个同包下的工具类
class PackageTool {
// 默认访问权限的属性
String toolName;
// 默认访问权限的方法
void printToolInfo() {
System.out.println("工具名称:" + toolName);
}
}
同包下的类成员交互场景
同包类访问默认权限属性
当另一个类和上述PackageTool类处于同一个包下时,就可以直接访问它的默认权限属性,不需要通过getter、setter方法,也不需要导入额外的包。
// 和PackageTool同包的类
class ToolUser {
public void useTool() {
PackageTool tool = new PackageTool();
// 直接访问默认权限属性
tool.toolName = "默认权限测试工具";
// 调用默认权限方法
tool.printToolInfo();
}
}
如果我们将ToolUser移动到其他包下,再尝试访问toolName属性和printToolInfo方法,就会直接编译报错,提示该成员在包外不可访问。
同包类的继承场景下的访问规则
如果同包下的一个类继承了拥有默认权限成员的类,子类也可以直接访问父类的默认权限成员,不需要重写或者额外处理。
// 同包下的子类,继承PackageTool
class AdvancedTool extends PackageTool {
public void upgradeTool() {
// 直接访问父类的默认权限属性
this.toolName = "升级后的工具";
// 直接调用父类的默认权限方法
this.printToolInfo();
}
}
默认访问权限和其他权限的对比
我们可以通过下面的表格清晰看到默认访问权限和其他三种访问权限的区别:
| 访问权限修饰符 | 当前类 | 同包其他类 | 不同包子类 | 不同包非子类 |
|---|---|---|---|---|
| private | 可访问 | 不可访问 | 不可访问 | 不可访问 |
| 默认(无修饰符) | 可访问 | 可访问 | 不可访问 | 不可访问 |
| protected | 可访问 | 可访问 | 可访问 | 不可访问 |
| public | 可访问 | 可访问 | 可访问 | 可访问 |
使用默认访问权限的注意事项
- 默认访问权限适合那些仅需要在同包内共享,不需要对外暴露的类成员,能够有效控制代码的暴露范围,避免外部包随意修改内部状态。
- 如果后续需要将类迁移到其他包,或者需要让不同包的类访问该成员,就需要及时调整访问权限,避免破坏现有代码逻辑。
- 接口中的成员默认是
public权限,不能设置为默认访问权限,这一点需要注意,避免写接口时出现权限错误。
实际开发中的应用建议
在实际项目开发中,我们可以先给类成员设置默认访问权限,当后续有跨包访问的需求时再逐步提升权限,这样能最大程度保证代码的封装性。比如在工具包内部,很多仅供包内其他类使用的辅助方法和临时属性,都可以使用默认访问权限,避免被外部包误调用。
如果我们需要测试默认访问权限的效果,可以直接在本地创建两个同包的类,按照上述示例代码进行验证,观察编译和运行的反馈,就能快速掌握它的使用逻辑。
default_access_modifier同包类交互Java访问权限类成员访问控制修改时间:2026-06-14 10:51:23