当前位置: 首页 > news >正文

【从零开始java学习|第十一篇】构造一个JavaBean

目录

一、JavaBean 是什么?

JavaBean 的核心特性

二、构造 JavaBean 的步骤

步骤 1:定义私有(private)的成员变量

目的

规范与细节

示例代码

步骤 2:提供无参构造方法

目的

规范与细节

示例代码

步骤 3:提供公共(public)的 getter 和 setter 方法

目的

规范与细节

示例代码

步骤 4:可选增强(提升实用性)

示例代码(增强后)

三、JavaBean 的使用举例(实战场景)

场景 1:基础使用(创建对象、赋值、取值)

运行结果

场景 2:作为方法参数(传递数据)

场景 3:框架适配(以 MyBatis 为例)

四、总结

一、JavaBean 是什么?

JavaBean 是符合特定设计规范的 Java 类,本质是一种 “标准化的数据封装载体”,核心作用是安全、规范地存储和传递数据,同时保证代码的可重用性、可维护性和框架兼容性。

JavaBean 的核心特性

  1. 封装性:通过私有成员变量 + 公共访问方法,隐藏数据细节,仅暴露安全的操作接口;
  2. 规范性:遵循固定设计规则(如成员变量私有、无参构造必现),确保不同开发者 / 框架能统一使用;
  3. 兼容性:适配 Java 生态中主流框架(如 Spring、MyBatis、Servlet),框架可通过反射自动操作 JavaBean(如赋值、取值);
  4. 可重用性:作为通用数据模型(如用户、订单、商品),可在项目中跨模块复用。

可以说,JavaBean 是 Java 里一种纯 POJO的组件模型,本质是一个普通 Java 类,作为可重用、可组装的数据容器,在 JSP、Spring、MyBatis、Jackson 等框架里被“当成对象用、靠反射赋值”。只要同时满足:

  1. 有无参构造器(默认或显式)。

  2. 字段私有,通过 getXxx/setXxx 方法暴露读写(布尔可用 isXxx)。

  3. 实现 java.io.Serializable(可选,但常规都加,方便序列化)。

二、构造 JavaBean 的步骤

构造 JavaBean 需严格遵循 4 个核心步骤,每个步骤都有明确的设计目的和规范要求,缺一不可:

步骤 1:定义私有(private)的成员变量

目的

通过private修饰符限制外部直接访问成员变量,避免数据被随意修改(体现封装性的核心),仅允许通过后续的getter/setter方法操作数据。

规范与细节
  • 访问修饰符:必须用private(不能用public/protected,否则破坏封装);
  • 命名规则:遵循 “小驼峰命名法”(首字母小写,后续单词首字母大写,如userNameorderId);
  • 数据类型:根据业务需求选择(基本类型如int age,引用类型如String address);
  • 默认值:成员变量存于堆内存,会自动赋予默认值(如int0Stringnull,无需手动初始化)。
示例代码
public class User {// 私有成员变量:存储用户的核心数据,外部无法直接访问private String userName;  // 用户名private String password;  // 密码(私有避免直接暴露)private int age;          // 年龄private boolean isVip;    // 是否为VIP(布尔类型命名建议用isXxx)
}

步骤 2:提供无参构造方法

目的
  • 保证 JavaBean 能被 “无参数初始化”,这是框架(如 Spring、MyBatis)通过反射创建对象的核心要求(框架无法预知自定义构造的参数);
  • 若未手动定义任何构造方法,编译器会自动生成一个默认无参构造;但一旦定义了其他构造(如带参构造),默认无参构造会消失,必须手动添加。
规范与细节
  • 方法名:必须与类名完全一致(如类名User,构造方法名User);
  • 返回值:无返回值类型(连void都不能写,这是构造方法与普通方法的核心区别);
  • 访问修饰符:建议用public(确保外部 / 框架能访问);
  • 方法体:可空(仅用于初始化对象,复杂初始化逻辑可在内部添加,如this.age = 18;默认年龄)。
示例代码
public class User {// 步骤1:私有成员变量(同上)private String userName;private String password;private int age;private boolean isVip;// 步骤2:手动添加无参构造(关键!框架依赖)public User() {// 可选:添加默认初始化逻辑this.age = 18;  // 新用户默认年龄18this.isVip = false;  // 新用户默认非VIP}
}

步骤 3:提供公共(public)的 getter 和 setter 方法

目的
  • getter:对外提供 “读取成员变量值” 的接口(如getUserName()获取用户名);
  • setter:对外提供 “修改成员变量值” 的接口(如setPassword()设置密码),且可在方法内添加数据校验(如年龄不能为负数),保证数据安全。
规范与细节
  1. 命名规则(框架识别的关键,必须严格遵守):
    • 普通属性(如userName):gettergetUserName()settersetUserName(String userName)(首字母大写,前缀get/set);
    • 布尔属性(如isVip):getter可写为isVip()(更直观)或getIsVip()setter仍为setIsVip(boolean isVip)
  2. 访问修饰符:必须用public(确保外部可调用);
  3. 参数与返回值
    • getter:无参数,返回值类型与成员变量一致(如public String getUserName());
    • setter:有一个参数(类型与成员变量一致),返回值通常为void(也可返回this实现链式调用,进阶用法);
  4. 数据校验:在setter中添加逻辑(如年龄范围校验),避免非法数据存入。
示例代码
public class User {// 步骤1:私有成员变量(同上)private String userName;private String password;private int age;private boolean isVip;// 步骤2:无参构造(同上)public User() {this.age = 18;this.isVip = false;}// 步骤3:getter和setter方法(带数据校验)// 1. userName的getter和setterpublic String getUserName() {return userName;  // 返回私有变量值}public void setUserName(String userName) {// 校验:用户名不能为null或空字符串if (userName != null && !userName.trim().isEmpty()) {this.userName = userName;  // this区分成员变量和局部变量} else {System.out.println("用户名不能为空!");}}// 2. password的getter和setterpublic String getPassword() {return password;}public void setPassword(String password) {// 校验:密码长度至少6位if (password != null && password.length() >= 6) {this.password = password;} else {System.out.println("密码长度不能少于6位!");}}// 3. age的getter和setterpublic int getAge() {return age;}public void setAge(int age) {// 校验:年龄范围1-150if (age >= 1 && age <= 150) {this.age = age;} else {System.out.println("年龄必须在1-150之间!");}}// 4. isVip的getter(布尔类型用isXxx更直观)和setterpublic boolean isVip() {return isVip;}public void setIsVip(boolean isVip) {this.isVip = isVip;  // 布尔类型无需复杂校验,直接赋值}
}

步骤 4:可选增强(提升实用性)

除核心三步外,可添加以下功能让 JavaBean 更易用:

  1. 带参构造方法:方便创建对象时直接赋值(无需多次调用setter);
  2. 重写toString()方法:默认toString()返回 “类名 @哈希值”(如User@1234),重写后可直接打印对象的属性值(便于调试);
  3. 实现Serializable接口:支持对象序列化(如网络传输、写入文件,框架常用)。
示例代码(增强后)
import java.io.Serializable;  // 导入序列化接口public class User implements Serializable {  // 实现序列化接口// 步骤1:私有成员变量(同上)private String userName;private String password;private int age;private boolean isVip;// 步骤2:无参构造(同上)public User() {this.age = 18;this.isVip = false;}// 步骤4-1:带参构造(方便快速初始化)public User(String userName, String password, int age, boolean isVip) {// 调用setter复用校验逻辑(避免重复写校验)this.setUserName(userName);this.setPassword(password);this.setAge(age);this.isVip = isVip;}// 步骤3:getter和setter(同上,省略重复代码)// ...(此处省略getUserName、setUserName等方法)// 步骤4-2:重写toString()(便于打印对象信息)@Overridepublic String toString() {return "User{" +"userName='" + userName + '\'' +", password='***'" +  // 密码脱敏,避免暴露", age=" + age +", isVip=" + isVip +'}';}
}

三、JavaBean 的使用举例(实战场景)

JavaBean 的核心用途是 “数据载体”,常见于 “接收用户输入”“传递数据库数据”“框架交互” 等场景,以下通过 3 个典型案例说明:

场景 1:基础使用(创建对象、赋值、取值)

通过 “无参构造 + setter” 或 “带参构造” 创建对象,用getter获取属性值,用toString()打印信息。

public class UserTest {public static void main(String[] args) {// 方式1:无参构造 + setter赋值(适合参数多、需逐步赋值的场景)User user1 = new User();user1.setUserName("张三");    // 调用setter,自动校验user1.setPassword("123456"); // 符合密码长度要求user1.setAge(25);            // 符合年龄范围user1.setIsVip(true);        // 设置为VIP// 用getter获取值System.out.println("用户名:" + user1.getUserName());System.out.println("是否VIP:" + user1.isVip());System.out.println("用户1完整信息:" + user1.toString());  // 调用重写的toString()// 方式2:带参构造直接赋值(适合参数少、一次性赋值的场景)User user2 = new User("李四", "654321", 30, false);System.out.println("\n用户2完整信息:" + user2.toString());// 测试非法数据(触发setter校验)User user3 = new User();user3.setUserName("");       // 用户名空,触发提示user3.setPassword("123");    // 密码短,触发提示user3.setAge(200);           // 年龄超范围,触发提示System.out.println("\n用户3完整信息:" + user3.toString());  // 非法值未存入}
}
运行结果
用户名:张三
是否VIP:true
用户1完整信息:User{userName='张三', password='***', age=25, isVip=true}用户2完整信息:User{userName='李四', password='***', age=30, isVip=false}用户名不能为空!
密码长度不能少于6位!
年龄必须在1-150之间!
用户3完整信息:User{userName='null', password='null', age=18, isVip=false}

场景 2:作为方法参数(传递数据)

将 JavaBean 作为方法参数,统一传递多个相关数据(避免方法参数过多,如method(String name, int age, ...))。

// 模拟“用户服务类”,处理用户相关逻辑
public class UserService {// 方法:传入User对象,判断是否为成年VIPpublic boolean isAdultVip(User user) {// 用getter获取属性值(无需关心内部存储细节)return user.getAge() >= 18 && user.isVip();}
}// 测试
public class UserServiceTest {public static void main(String[] args) {User user = new User("王五", "12345678", 22, true);UserService service = new UserService();// 传递User对象给方法boolean result = service.isAdultVip(user);System.out.println(user.getUserName() + "是否为成年VIP:" + result); // 输出:true}
}

场景 3:框架适配(以 MyBatis 为例)

MyBatis(ORM 框架)可自动将数据库查询结果 “映射” 到 JavaBean 中,无需手动赋值(依赖 JavaBean 的无参构造和setter)。

  1. 数据库表(user)

    字段名类型说明
    user_namevarchar用户名
    passwordvarchar密码
    ageint年龄
    is_vipboolean是否为 VIP
  2. MyBatis 映射文件(UserMapper.xml)

    <!-- 自动映射:数据库字段→JavaBean属性(依赖setter) -->
    <select id="getUserById" resultType="com.example.User">SELECT user_name, password, age, is_vip FROM user WHERE id = #{id}
    </select>
    
  3. Java 代码

    // MyBatis接口
    public interface UserMapper {User getUserById(int id); // 返回值为JavaBean
    }// 调用(MyBatis自动创建User对象,用setter赋值)
    User user = userMapper.getUserById(1);
    System.out.println(user); // 直接打印JavaBean(依赖重写的toString())
    

四、总结

JavaBean 并非 “特殊类”,而是遵循 “私有成员 + 无参构造 + getter/setter” 规范的普通 Java 类,其核心价值在于:

  1. 标准化封装:通过固定规范保护数据安全,避免非法值存入;
  2. 低耦合高复用:作为通用数据载体,可在不同模块、框架间无缝传递;
  3. 框架兼容性:适配 Spring、MyBatis 等主流框架,减少手动编码工作量。

掌握 JavaBean 的构造步骤(私有成员→无参构造→getter/setter→可选增强)和使用场景,是 Java 开发(尤其是企业级开发)的基础技能,也是后续学习框架的关键前提。

如果我的内容对你有帮助,请点赞,评论,收藏。接下来我将继续更新相关内容!


文章转载自:

http://xvUU6LQv.dppfh.cn
http://VEdogspx.dppfh.cn
http://bbjKzzu3.dppfh.cn
http://zz24HMLF.dppfh.cn
http://cPxA0BZf.dppfh.cn
http://dOm3HxUP.dppfh.cn
http://unnpt17y.dppfh.cn
http://o0I4KJvp.dppfh.cn
http://zT8i6NPl.dppfh.cn
http://jjnK90Gl.dppfh.cn
http://0XsRdVja.dppfh.cn
http://36wXeVM8.dppfh.cn
http://5L4zEVUO.dppfh.cn
http://fmSKyfyf.dppfh.cn
http://B8bdGmDh.dppfh.cn
http://azc1vU1Z.dppfh.cn
http://OAbNScv3.dppfh.cn
http://6kr0JGwq.dppfh.cn
http://99DvRjK7.dppfh.cn
http://pNYqftOI.dppfh.cn
http://eHQId7JX.dppfh.cn
http://uQCuUj4Q.dppfh.cn
http://mdgpVIWs.dppfh.cn
http://1jhEBLf4.dppfh.cn
http://Hv7UPOKl.dppfh.cn
http://kGp3Vh9b.dppfh.cn
http://HtoLpAMn.dppfh.cn
http://qQ8T69Lj.dppfh.cn
http://APKkeHbj.dppfh.cn
http://AYoez9eI.dppfh.cn
http://www.dtcms.com/a/372296.html

相关文章:

  • 侠盗飞车圣安地列斯原版中文资源,适配Win10/11,不用安装!
  • Linux —— 虚拟进程地址空间
  • 负载均衡器如何自动将故障实例从服务列表中剔除
  • MySQL软件架构概述
  • 【面试】AI大模型应用原理面试题
  • postman接口功能测试
  • Java数据结构 - 顺序表模拟实现与使用
  • 【秋招笔试】2025.09.04携程秋招
  • PyPI 镜像源选择与 pipenv/poetry 加速配置(含实战与避坑)
  • 如何设计本地缓存、有哪些坑需要避免
  • 人力资源管理的思维方法学习笔记1
  • 【面试向】边缘计算基础介绍
  • digitalworld.local: TORMENT
  • MySQL数据库专用命令详细使用指南
  • Python3.12-slim版本
  • AI 生成式艺术重塑动漫角色创作:从技术逻辑到多元可能性(三)
  • 【面试向】元宇宙介绍
  • 硬件开发(4)—ARM裸机体系结构
  • Stream API三巨头:filter、map、collect
  • NAS可以干啥?好玩吗?
  • GDAL 在 Python 中的开发起步
  • RK3568编译linux内核遇到问题总结
  • React学习教程,从入门到精通, React 样式语法知识点与案例详解(13)
  • BiFormer注意力机制YOLOV8
  • 【算法】字符串专题
  • 谓语动词选择指南
  • JavaScript常见算法题分类
  • python---多态
  • 中兴B860AV3.2-M/B860AV3.1-M2-内存大小区分参考指南
  • 【开题答辩全过程】以 校园二手货物交易平台为例,包含答辩的问题和答案