访问限定符是Java封装的核心机制,如同手机隐私设置:公开信息、家庭共享(protected)、私有数据各有访问边界。
一、访问限定符核心作用
封装强化
- 隐藏内部实现细节(如敏感数据)
- 暴露安全接口(如公共方法)
public class BankAccount {
private double balance; // 私有属性隐藏资金细节
public void deposit(double amount) { ... } // 安全操作接口
}
风险防控
- 防止外部代码意外修改关键状态
- 避免类间非法依赖(降低耦合度)
设计优化
- 明确类间交互契约
- 提升代码可维护性和扩展性
二、四种访问限定符详解

1. Private(最严格)
-
作用域:仅当前类内可访问
-
典型应用:封装敏感属性/内部方法
public class SecureSystem { private String secretKey; // 外部不可见 private void logAccess() { ... } // 内部日志方法 }
2. Default(包级私有)
-
触发条件:未显式声明限定符
-
作用域:同包内可见
package utils; class ConfigLoader { // 默认访问限定 String loadConfig() { ... } // 仅utils包内可用 }
3. Protected(继承友好)
-
作用域:同包内 + 跨包子类
-
继承场景:
package animals; public class Animal { protected String dna; // 子类可访问 } package pets; import animals.Animal; public class Cat extends Animal { public void printDNA() { System.out.println(dna); // 子类跨包访问 } }
4. Public(全局开放)
-
作用域:全局可见
-
使用场景:API接口、工具类方法
public class MathUtils { public static final double PI = 3.14159; // 开放常量 public static int add(int a, int b) { ... } // 公共方法 }
访问范围对比表
| 限定符 | 同类 | 同包 | 子类(跨包) | 任意位置 |
|---|---|---|---|---|
private | ✅ | ❌ | ❌ | ❌ |
default | ✅ | ✅ | ❌ | ❌ |
protected | ✅ | ✅ | ✅ | ❌ |
public | ✅ | ✅ | ✅ | ✅ |
三、包(Package):访问控制的组织单元
1. 包的核心价值
-
命名隔离:避免类名冲突
package com.company.finance; public class Calculator { ... } // 不会与com.company.math.Calculator冲突 -
访问控制:配合默认访问限定实现包级封装
2. 包的使用规范
-
声明语法:文件首行定义
package com.example.utilities; // 包声明 -
导入机制:精确引用所需类
import com.example.utilities.StringUtils; // 单类导入 import com.example.utilities.*; // 整包导入(谨慎使用)
3. 包层次化设计
src
└── com
└── company
├── finance // 财务模块
│ ├── Calculator.java
│ └── TaxProcessor.java
└── hr // 人力资源模块
├── Employee.java
└── Payroll.java
四、Protected在继承中的关键作用
1. 父子类数据共享
public class Device {
protected String serialNo; // 子类可访问
}
public class SmartDevice extends Device {
public void register() {
System.out.println("注册设备: " + serialNo); // 直接使用父类属性
}
}
2. 构造器链式调用
-
super():显式调用父类构造器
public class PositiveNumber extends MyNumber { public PositiveNumber(int val) { super(val); // 调用父类构造器初始化 } }
3. 访问控制实践案例
public class MyNumber {
private int value; // 严格私有
protected void setValue(int v) { // 子类可调用的保护方法
this.value = v;
}
}
public class PositiveNumber extends MyNumber {
public void safeSet(int v) {
if (v > 0) setValue(v); // 通过保护方法间接修改私有属性
}
}
五、高频问题解答
如何选择访问限定符?
- 首选
private:属性/内部方法 - 次选
protected:需继承扩展的成员 - 谨慎
public:API接口常量 - 避免
default:包内工具类
跨包子类如何访问父类成员?
- 父类成员需声明为
protected - 子类通过继承关系直接访问
私有方法能被重写吗?
class Parent {
private void hidden() { ... } // 不可重写
}
class Child extends Parent {
private void hidden() { ... } // 这是全新方法,非重写!
}
总结:访问控制四原则
- 最小可见性:从
private开始,按需放宽 - 包即边界:用包划分逻辑模块,配合默认访问
- 继承专用:
protected为子类定制扩展点 - 契约思维:
public方法即不可变承诺
掌握访问限定符如同获得代码"隐私管理权",是构建健壮、可维护Java系统的基石。
92

被折叠的 条评论
为什么被折叠?



