一、封装介绍
封装(encapsulation)是将 抽象出的数据[属性] 和 对数据的操作[方法] 封装在一起,
数据被保护在内部,程序的 其他部分只有 通过被授权的 操作[方法] ,才能对数据进行操作
对电视机的操作就是典型的封装
电视机的开关机 音量加减 过程其实很复杂,但是对于用户而言 ,只需按按钮即可,不需要关系内部发生的事情。
二、封装的好处
1、隐藏实现细节 方法(例如连接数据库)-->调用(传入需要的参数即可)
2、可以对进行数据进行验证,保证安全合理
三、封装的三步实现步骤
1、将属性进行私有化private [让外部不能直接修改属性]
2、提供一个公共的(public)set方法,用于对属性值判断并赋值
public XX setXxx(){//Xxx表示某个属性
//加入数据验证的业务逻辑
属性 = 参数名;
}
3、提供一个公共的(public)get方法,用于获取属性的值
public 数据类型 getXxx(){//权限判断
return xx;
}
//自己写 SetXxx 和 getXxx太慢 这里使用 快捷键 alt + insert或者右键 选择generate 再选择Getter and Setter
四、快速入门案例
/* 创建一个程序,要求不能随便查看人的 年龄、工资等隐私,并对设置的年龄进行合理的验证。 若年龄合理再进行设置,否则给默认年龄,必须在1~120,工资不能直接查看,name的长度必须在2~6字符 */
package com.lmdedu.encap;
public class Encapsulation01 {
public static void main(String[] args) {
//创建对象
Person person = new Person();
//因为salary和age私有化,不在同一个类中,不能直接进行赋值,所以使用set方法进行赋值
//设置属性
person.setName("jack");
person.setAge(30);
person.setSalary(30000);
System.out.println(person.info());
//要求工资不能直接查看,所以 person.salary不能查看
//可以通过方法getSalary 进行查看
System.out.println(person.getSalary(666666));
}
}
/*
创建一个程序,要求不能随便查看人的 年龄、工资等隐私,并对设置的年龄进行合理的验证。
若年龄合理再进行设置,否则给默认年龄,必须在1~120,工资不能直接查看,name的长度必须在2~6字符
*/
class Person {
public String name;
private int age;
private double salary;
//自己写 SetXxx 和 getXxx太慢 这里使用 快捷键 alt + insert或者右键 选择generate 再选择Getter and Setter
//然后根据要求慢慢完善代码
public String getName() {
return name;
}
public void setName(String name) {
//判断 name的长度必须在2~6字符
if(name.length() >= 2 && name.length() <= 6 ) {
this.name = name;
}
else{
System.out.println("名字的长度不对,需要2~6个字符");
this.name = "无";
}
}
public int getAge() {
return age;
}
public void setAge(int age) {
//判断 若年龄合理再进行设置,否则给默认年龄,必须在1~120,
if (age >= 1 && age <= 120) {
this.age = age;
}else{
System.out.println("年龄需要在1~120,你设置的年龄不在范围内");
//设置默认年龄
this.age = 18;
}
}
public double getSalary(int code) {
//增加对当前对象的权限判断
if(code == 666666) {
return salary;
}else{
System.out.println("你输入的密码有误");
return 0;
}
}
public void setSalary(double salary) {
this.salary = salary;
}
//写一个方法,返回属性信息
public String info() {
return "信息为 name" + name + "age = " + age + "salary" + salary;
}
}
为了直接使用构造器绕过判断条件进行赋值,我们可以将 set方法写在构造器中
class Person {
//构造器
public Person(String name, int age, double salary) {
// this.name = name;
// this.age = age;
// this.salary = salary;
//为了直接使用构造器绕过判断条件进行赋值,我们可以将 set方法写在构造器中
setName(name);
setAge(age);
setSalary(salary);
}
五、课堂练习
创建程序,在其中定义两个类: Account和AccountTest类体会Java的封装性
1、Account类要求具有属性: 姓名 (长度为2位3位或4位)、余额(必须>20)密码(必须是六位),如果不满足,则给出提示信息,并给默认值
2、通过setXxx的方法给Account 的属性赋值
3、在AccountTest中测试
文件目录
Account文件
package com.lmdedu.encap;
public class Account {
//Account 类要求具有属性:姓名(2~4位) 余额(>20) 密码(必须是六位),若不满足给出提示并 给默认值
//定义属性
private String name;
private double money;
private String code;
//提供两个构造器
//无参构造器
public Account() {
}
//构造器
public Account(String name, double money, String code) {
//使用setXxx方法
this.setName(name);
this.setMoney(money);
this.setCode(code);
}
//get and set 属性 name
public String getName() {
return name;
}
public void setName(String name) {
//判断
int len = name.length();
if (len >= 2 && len <= 4) {
this.name = name;
}else{
//提示信息
System.out.println("输入的名字必须为2~4位,默认为无名氏");
//默认值
this.name = "无名氏";
}
}
//get and set 属性 money
public double getMoney() {
return money;
}
public void setMoney(double money) {
//判断
if(money > 20) {
this.money = money;
}else{
//提示信息
System.out.println("余额必须>20,默认为0");
//默认值
this.money = 0;
}
}
//get and set 属性 code
public String getCode() {
return code;
}
public void setCode(String code) {
//数组长度用length, 字符串长度用length()
int len = code.length();
if(len == 6) {
this.code = code;
}else{
//提示信息
System.out.println("密码必须为6位,默认为000000");
//默认值
this.code = "000000";
}
}
public String info(){
//设置访问账户信息的权限
if(code.equals("666666") || code.equals("999999")) {
return "name为" + name + "\t" + "money" + money + "\t" + "code为" + code;
}else{
return "密码错误";
}
}
}
AccountTest类
package com.lmdedu.encap;
public class AccountTest {
public static void main(String[] args) {
//创建对象 account
//在构造器中 已经利用 setXxx进行了赋值
Account account = new Account("lmd",23,"666666");
//显示账户信息
System.out.println(account.info());
//创建对象 account1
//使用无参构造器对account1进行初始化
Account account1 = new Account();
//直接使用setXxx进行赋值
account1.setName("jjf");
account1.setMoney(24);
account1.setCode("999999");
//展示账户信息
System.out.println(account.info());
}
}