目录
1.什么是Java的封装
封装(Encapsulation)是面向对象方法的重要原则,就是把对象的属性和操作(或服务)结合为一个独立的整体,并尽可能隐藏对象的内部实现细节。
封装是把过程和数据包围起来,对数据的访问只能通过已定义的接口。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。封装是一种信息隐藏技术,在java中通过关键字private,protected和public实现封装。什么是封装?封装把对象的所有组成部分组合在一起,封装定义程序如何引用对象的数据,封装实际上使用方法将类的数据隐藏起来,控制用户对类的修改和访问数据的程度。 适当的封装可以让程式码更容易理解和维护,也加强了程式码的安全性。
2. 封装【掌握】
2.1 为什么要封装?【了解】
先来下面一个案例:
package cn.zs.potting1;
/**
* 账户Account类
* 封装引入
*/
public class Account {
/** String类型成员变量姓名name */
protected String name;
/** String类型成员变量密码pwd */
String pwd;
/** double类型成员变量余额money */
double money;
/** boolean类型成员变量是否是vip用户 */
boolean vip;
/**
* Account类无参构造
*/
public Account() {}
/**
* 有4个参数构造方法
* @param n
* @param p
* @param m
* @param v
*/
public Account(String n, String p, double m, boolean v) {
name = n;// 将局部变量n赋值给成员变量name
pwd = p;// 将局部变量p赋值给成员变量pwd
money = m;// 将局部变量m赋值给成员变量money
vip = v;// 将局部变量v赋值给成员变量vip
}
/**
* 获取当前成员变量money的值
* @return
*/
public double getMoney() {
return money;
}
}
测试类:
package cn.zs.potting1;
/**
* Account测试类
* 封装的引入
*/
public class AccountTest {
public static void main(String[] args) {
// 创建Account对象,调用无参构造
Account acc1 = new Account();
// 给acc1成员变量赋值
acc1.name = "某菲";
acc1.pwd = "6969";
acc1.money = 1.0;
acc1.vip = false;
// 打印acc1成员变量的值
System.out.println(acc1.name);
System.out.println(acc1.pwd);
System.out.println(acc1.money);
System.out.println(acc1.vip);
// acc1调用getMoney方法
double money = acc1.getMoney();// 因为getMoney方法是非static修饰,并且有返回值,所以用acc1调用,用double变量接收
System.out.println(money);
// 需求:当money达到50000.00的时候,会将vip升级为true。现在,能不能没有达到5万就不能升级。
acc1.vip = true;// 这里没有经过任何权限判断,直接修改了值,不安全。所以,用封装解决这个问题。
System.out.println(acc1.vip);// true
}
}
出现上面测试类中的需求的时候,我们原来设计类的方式就不能满足需求了。那么我们怎么解决这个问题呢?
我们先来看看生活中我们是怎么解决类似问题的
- 大家想一想生活中封装是什么?
例如:
- 网购一个娃娃,我们都会发现,娃娃邮寄的时候,都是用箱子装起来。箱子是保护里面娃娃安全的。
- 台式机电脑,我们发现[主板、显卡、内存、电源、硬盘…]都是装在机箱中,其实机箱不是电脑运行必须的,那么其作用是什么呢?机箱是保护里面硬件的安全。
以上示例的共同点总结:
都是通过物理方式封装的操作,通过控制访问的方式达到保护内部成员的目的。
而Java中是通过封装来完成保护内部成员的目的,所以,这就是我们学习封装的目的。
2.2 封装的作用【了解】
封装是为了保护内部数据的安全:
1. 不希望在外部类中随意访问类中的成员变量
2. 达到权限要求的才能访问。
3. 只是获取数据的时候。例如:单例模式。