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

【Java学习笔记】封装

封装(encapsulation

面向对象的三大基本特征

什么是封装?

封装(encapsulation)就是把抽象出的数据属性和对数据的操作方法封装在一起,数据被保护在内部,程序的其它部分只有通过被授权的操作方法,才能对数据进行操作。

好处

封装的实现(三步走)

public void setxxx(类型,参数名) {//  xx 表示某个属性// 加入数据验证的业务逻辑属性 = 参数名;
}
  • (3)提供一个公共的(publicget 方法,用于获取属性的值

public void setxxx() {// 权限判断 xx 表示某个属性return xx;
}

两个案例快速入门

案例一

定义一个 person 类,要求不能随便查看人的年龄,工资这两个隐私,并对设置的年龄进行合理的验证,年龄合理就是设置,否则给默认年龄,必须在 1 - 120 岁之间,工资不能随便查看

package encapsulation;import java.util.Scanner;public class test1 {public static void main(String[] args) {person p = new person();p.setName("jacskon");p.setAge(18);p.setSalary(10000);p.getSalary();p.getinfo();// 使用构造器初始化测试person p1 = new person("1234567",0,1);p1.getinfo();}
}class person {// 定义属性public String name;private int age;private double salary;// 声明无参构造器public person() {}// 声明初始化属性的构造器public person(String name, int age, double salary) {// 为了防止使用构造器初始化然而绕过了业务逻辑的判断,在构造器里调用方法setName(name);setAge(age);setSalary(salary);}// 使用快捷键 alt + insert 生成 getter,setter ;按住 ctrl / shift 实现多选public String getName() {return name;}public void setName(String name) {if (name.length() >= 2 && name.length() <= 6) {this.name = name;} else {System.out.println("你输入的名字:" + name +"不合理\n提醒:名字长度需要在2-6个字符之间,给你默认姓名---用户01");this.name = "用户01";}}public int getAge() {return age;}public void setAge(int age) {if (age >= 1 && age <= 120) {this.age = age;} else {System.out.println("你的年龄不合理,给你默认年龄----18");this.age = 18;}}public double getSalary() {int cnt = 1;while(true){System.out.println();System.out.println("这是第" + cnt + "次身份验证");System.out.print("输入密码验证身份:");Scanner input = new Scanner(System.in);String password = input.next();if (password.equals("123")) {System.out.println();System.out.println("身份验证通过~~");System.out.println("您的薪水是:" + salary);break;} else {System.out.println();System.out.print("身份验证失败,重新输入密码");System.out.println();cnt += 1;}if(cnt == 4){System.out.println("三次密码错误,身份验证失败,账户锁定!");break;}}return 0;}public void setSalary(double salary) {this.salary = salary;}// 写一个方法返回所有信息public void getinfo() {System.out.println();System.out.println("=====个人信息如下=====");System.out.println("姓名:" + name);System.out.println("年龄:" + age);System.out.println("工资:" + salary);}
}// 输出结果你输入的名字:jacskon不合理
提醒:名字长度需要在2-6个字符之间,给你默认姓名---用户01这是第1次身份验证
输入密码验证身份:123身份验证通过~~
您的薪水是:10000.0=====个人信息如下=====
姓名:用户01
年龄:18
工资:10000.0
你输入的名字:1234567不合理
提醒:名字长度需要在2-6个字符之间,给你默认姓名---用户01
你的年龄不合理,给你默认年龄----18=====个人信息如下=====
姓名:用户01
年龄:18
工资:1.0

案例二

创建程序,在其中定义两个类:Account 和 AccountTest 类会封装 Java 的封装性。

1. Account 类要求具有以下属性:

  • 姓名(长度为 2 至 3 位或 4 位)

  • 余额(必须>20)

  • 密码(必须是六位,如果不足,则给出提示信息,并给默认值【程序员自己定】)

2. 通过 setXxx 的方法给 Account 的属性赋值。

3. 在 AccountTest 中测试。

package encapsulation;import java.util.Scanner;public class test2 {public static void main(String[] args) {accounttest test = new accounttest();test.init();System.out.println("\n");System.out.println("=====这里是acoount传入数据的返回结果");account test1 = new account();test1.setName("jackson");test1.setBalance(10);test1.setPassword("123");test1.getinfo();}
}class account {String name;double balance;String password;// 声明无参构造器public account() {}// 构造器public account(String name, double balance, String password) {setName(name);setBalance(balance);setPassword(password);}public String getName() {return name;}public void setName(String name) {if (name.length() >= 2 && name.length() <= 4) {this.name = name;} else {System.out.println("输入的名字长度应在2-4个字符,给你默认姓名:01");this.name = "01";}}public double getBalance() {return balance;}public void setBalance(double balance) {if (balance >= 20) {this.balance = balance;} else {System.out.println("余额不足20,默认余额设为0");}}public String getPassword() {return password;}public void setPassword(String password) {while (true) {if (password.length() == 6) {System.out.println("密码设置成功~~");this.password = password;break;} else {System.out.print("密码长度需要六位,请重新输入:");Scanner input = new Scanner(System.in);password = input.next();System.out.println();}}}public void getinfo(){System.out.print("名字:" + name + "\n余额:" + balance + "\n密码:" + password);}
}class accounttest {public void init(){System.out.println("====这里是accounttest传入数据的返回结果");account person = new account();person.setName("jack");person.setBalance(25);person.setPassword("123456");person.getinfo();}
}// 输出结果
====这里是accounttest传入数据的返回结果
密码设置成功~~
名字:jack
余额:25.0
密码:123456=====这里是acoount传入数据的返回结果
输入的名字长度应在2-4个字符,给你默认姓名:01
余额不足20,默认余额设为0
密码长度需要六位,请重新输入:123456密码设置成功~~
名字:01
余额:0.0
密码:123456

案例二充分体会了在不同类中调用方法

相关文章:

  • C# 语言介绍
  • 实变函数 第四章 可测函数
  • 系统 Python 与 Conda 环境的灵活切换
  • 4、反应釜压力监控系统 - /自动化与控制组件/reaction-vessel-monitor
  • JavaScript 数据存储全攻略:从 Cookie 到 IndexedDB
  • 关于 js:2. 对象与原型链
  • 六个仓库合并为一个仓库,保留master和develop分支的bat脚本
  • Linux启动自动运行sh文件(可控制启动顺序)
  • git 入门使用教程
  • 路由器NAT回流踩坑
  • 黑电平校正(Black Level Correction, BLC)算法
  • ai说什么是注解,并以angular ts为例
  • 基于 by 组态的智能工厂设备运行实时监控系统
  • OrangePi Zero 3学习笔记(Android篇)2 - 第一个C程序
  • 政务浏览器 一站式首页功能配置说明
  • JavaScript ES6+ 最佳实践
  • 【DB2】DB2启动失败报错SQL1042C
  • 2025-05-07 Unity 网络基础7——TCP异步通信
  • 什么是声明式UI什么是命令式UI?鸿蒙ArkTS为什么是声明式UI-优雅草卓伊凡
  • 智算中心基础设施0-1建设全流程及投产后的运维
  • 宣布停火后,印控克什米尔地区再次传出爆炸声
  • 乌外长:乌方准备无条件停火至少30天
  • 阚吉林任重庆市民政局党组书记,原任市委组织部主持日常工作的副部长
  • 西安机场回应航站楼“水帘洞”事件:屋面排水系统被冰雹堵塞
  • 理财经理泄露客户信息案进展:湖南省检受理申诉,证监会交由地方监管局办理
  • 长期对组织隐瞒真实年龄,广元市城发集团原董事韩治成被双开