Access modifiers 控制类成员的可见性,通过限制谁可以读取或调用它们来强制封装。
| Modifier | 可从以下位置访问 |
|---|
public | 任何地方 |
protected | 类 及其子类 |
private | 仅 在声明类内部 |
public class Employee {
private double salary; // internal — only Employee touches it
protected String department; // subclasses may use it
public String name; // open to all
public double getSalary() { // controlled, public read access
return salary;
}
}
salary 是 private 的,所以任何外部代码都无法破坏它;public getter 是唯一的访问窗口。
class Demo:
def __init__(self):
self.public = 1
self._protected = 2 # convention only ("don't touch")
self.__private = 3 # name-mangled to _Demo__private
Python 没有强制 private——它依赖命名约定。Java/C# 在编译时强制执行修饰符。Java 还有 package-private(默认值,无关键字)。
将所有内容都设为 public 会破坏封装。应默认使用最严格的级别,只在有真实需求时才放宽限制。
Access modifiers 是将封装从一项原则转化为编译器检查的强制规则的具体工具。
较小的 public 表面积意味着更少的代码依赖内部实现,因此您可以自由重构而不会破坏调用者。