java中定义带私有属性和公共方法的类需用private修饰字段、public修饰方法及构造器,通过getxxx()/setxxx()提供受控访问,并在setter中校验数据(如age≥0),避免nullpointerexception和非法值修改。

Java里怎么写一个带私有属性和公共方法的类
直接上手:用 private 修饰字段,用 public 修饰方法,再加个 public 构造方法——这就是最基础的封装。不是“先学概念再写”,而是“写了才明白为什么得这么写”。
常见错误现象:NullPointerException 频繁出现,或者外部代码直接改了不该改的值(比如把 age 设成 -5),根本原因是字段没封住、方法没做校验。
-
private字段不能被外部类直接访问,这是强制的,编译器会报错 - 如果字段需要读写,就配一对
getXxx()/setXxx(...)方法,别偷懒只写一个 - 在
setXxx(...)里加校验逻辑(比如if (value ),这才是封装的实质,不是光加个 <code>private就完事 - 构造方法建议也设为
public,否则别的类连实例都创建不了;如果真想限制实例化,用private构造 + 静态工厂方法
getter/setter命名必须严格遵守JavaBeans规范吗
必须。JVM不检查,但几乎所有框架(Spring、Jackson、MyBatis)和IDE都依赖这个约定。写错一个字母,序列化或依赖注入就会静默失败。
使用场景:你写了个 User 类,想用 @RequestBody User user 接口接收JSON,或者用 user.getAge() 在模板里取值——这时候名字错了,字段就空着,还查不出原因。
立即学习“Java免费学习笔记(深入)”;
- 布尔字段例外:
isActive()是标准,getActive()不被识别;但setActive(true)仍要保留 - 字段名含多个大写字母时(如
XMLConfig),getter 必须是getXMLConfig(),不是getXmlconfig()或getXmlConfig()—— 这个细节 JDK 的Introspector类认得非常死 - IDE 自动生成的 getter/setter 一般没问题,但手动改过字段名后,务必右键 → “Generate…” 重新生成,别手敲
什么时候该用 public 字段而不是 private + getter
几乎从不。唯一合理的情况是:一个不可变的、纯粹的数据容器类,且字段是基本类型或 String,并且你明确不需要任何逻辑介入。
性能影响极小,但可维护性代价巨大。一旦后续要加日志、校验、缓存、通知,就得把 public 改回 private,所有调用处全得改——而用 getter 一开始就留好了扩展缝。
- 常量可以
public static final,比如public static final int MAX_RETRY = 3 - 枚举字段天然安全,
public没问题,如public enum Status { ACTIVE, INACTIVE } - 如果你在写 Android 的
Parcelable类,有些旧模板会建议public字段,但现在更推荐用private+read/writeToParcel中调用 getter/setter,更一致
IDEA/Eclipse 自动生成 getter/setter 时容易忽略什么
自动生成只是起点,不是终点。最容易漏的是:没删掉无用的 setter,或者没补上 null 安全逻辑。
错误现象:实体类有个 private List<string> tags</string>,自动生成了 setTags(List<string> tags)</string>,但外部传入 null 后,后续调用 tags.size() 直接崩——因为生成器不会帮你判空。
- 对集合类字段(
List、Map),setter 里应写成this.tags = tags != null ? new ArrayList(tags) : new ArrayList(),避免外部修改影响内部状态 - 对引用类型字段(比如
private Date createTime),getter 应返回副本:return createTime != null ? new Date(createTime.getTime()) : null,防止时间被意外篡改 - 如果字段是
final,IDE 不会生成 setter,但你要确认它是否真该是final——很多初学者误以为“封装=所有字段 final”,其实不然,业务对象多数字段是可变的
封装不是靠关键字堆出来的,是靠每次写 setXxx 时多想半秒:“这个值进来之后,我敢让它直接进内存吗?”










