不能直接用public成员变量,因为会失去数据校验、拦截和状态同步能力;必须用private修饰变量并提供带校验逻辑的getter/setter方法实现封装。

Java面向对象中,成员变量配合访问权限保护数据,核心在于用 private 修饰变量 + 提供受控的公共方法(getter/setter),而不是直接暴露字段。
为什么不能直接用 public 成员变量
public 成员变量等于把数据“敞开大门”:外部代码可随意读写,无法校验、无法拦截、无法同步更新关联状态。比如年龄设为 -5、邮箱填成"abc",类自身完全失控。
标准做法:private + getter/setter
这是封装的落地方式,既隐藏数据,又保留必要访问能力:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 所有成员变量声明为 private —— 确保只能在本类内部直接访问
- 需要读取时,提供 public 的 getXxx() 方法(如
getName()) - 需要修改时,提供 public 的 setXxx(参数) 方法(如
setAge(int age)),并在方法体内加入逻辑校验 - 例如设置年龄:在
setAge中判断if (age 150) throw new IllegalArgumentException("年龄不合法");
访问权限如何影响封装效果
四种权限决定了“谁能看到、谁能改”:
- private:最严,仅本类可用 → 是封装的起点
- default(包访问):同包内其他类可访问 → 适合模块内协作,但跨包即失效
- protected:同包类 + 不同包子类可用 → 主要为继承场景预留,子类可扩展但不开放给任意调用者
- public:任何地方都能访问 → 仅建议用于真正需要全局公开的方法,绝少用于成员变量
实际写法示例(Student 类)
以下结构是 JavaBean 规范,也是 IDE 自动生成的基础模板:
public class Student {
private String name; // 隐藏数据
private int age;
public Student() {} // 无参构造
public Student(String name, int age) { // 满参构造
this.name = name;
this.age = age;
}
// getter:只读接口
public String getName() { return name; }
// setter:带校验的写入接口
public void setAge(int age) {
if (age 120) {
throw new IllegalArgumentException("年龄必须在0~120之间");
}
this.age = age;
}
}
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










