public(公有)和 private(私有)是 Java 中最核心的访问权限修饰符,用于控制方法(也可修饰属性、内部类)的可访问范围,是面向对象「封装」特性的核心实现手段。
简单理解:
public 方法 = 类对外公开的功能入口
private 方法 = 类内部自用的工具方法,对外完全不可见
公有方法(public)
-
定义方式
在方法返回值类型前加上 public 关键字:
java
运行
public 返回值类型 方法名(参数列表) {
// 方法体
} -
核心特性
全范围可见:任何位置都能调用 —— 同一个类内部、同一个包的其他类、不同包的普通类、不同包的子类,全部可以访问。
核心作用:作为类对外暴露的官方功能入口,是外部代码和这个类交互的合法渠道。 -
典型应用场景
类的核心业务方法,比如 withdraw() 取款、transfer() 转账
属性的 getter / setter 方法,对外提供属性的读写入口
接口、抽象类中定义的规范方法,实现类实现时通常保持 public
私有方法(private) -
定义方式
在方法返回值类型前加上 private 关键字:
java
运行
private 返回值类型 方法名(参数列表) {
// 方法体
} -
核心特性
仅本类可见:只能在当前类的内部被其他方法调用;类外部(哪怕是子类、同一个包的类)完全无法访问和调用。
核心作用:封装内部实现细节,把复杂的公有方法拆分成多个小的私有方法,既提升代码可读性和复用性,又能隐藏内部逻辑,外部无需关心实现细节。 -
关键注意点
私有方法不能被重写:子类根本无法访问父类的私有方法,即便子类写了同名方法,也只是子类自己的新方法,不属于方法重写。
接口中不能定义私有抽象方法(接口方法默认是 public 抽象方法)。
完整示例
以 ATM 类为例,展示公有方法对外提供服务、私有方法内部处理细节:
java
运行
public class ATM {
// 公有方法:对外暴露的取款入口
public void withdraw(int amount) {
if (checkAmountValid(amount)) { // 调用内部私有校验方法
dispenseMoney(amount); // 调用内部私有出钞方法
System.out.println("取款成功");
}
}// 私有方法:内部金额校验,仅本类使用,外部不可见
private boolean checkAmountValid(int amount) {
return amount > 0 && amount % 100 == 0;
}// 私有方法:内部出钞逻辑,仅本类使用
private void dispenseMoney(int amount) {
System.out.println("出钞:" + amount + "元");
}
}
外部调用时,只能调用 withdraw(),无法直接调用两个私有方法,保证了内部逻辑的安全性和封装性。
最佳实践(封装原则)
属性私有化,功能公有化:属性全部用 private 修饰,对外通过 public 的 getter/setter 控制访问。
最小暴露原则:只把必须对外提供的方法设为 public,所有内部辅助、工具方法一律设为 private,降低类之间的耦合度。
外部只能通过 public 方法操作类,内部实现可以随意修改,不会影响外部调用代码。
浙公网安备 33010602011771号