1.封装介绍:
封装(encapsulation)就是把抽象的数据【属性】和对数据的操作【方法】封装在一起,数据被保护在内部,程序的其他部分只能通过被授权的操作【方法】,才能对数据进行操作。
以上是教科书般的说法,其实封装说白了就是把属性通过权限修饰符(private)进行私有化,这样就不能直接修改属性或赋值,此时就会使用set方法(对属性进行判断和赋值)和get方法(获取属性的值)。
2.封装的作用和好处
1)隐藏实现细节:方法(链接数据库)<--调用(传入参数)【ps:这部分如果不理解,后续更新】
2)可以对属性赋值时进行数据验证,保证安全合理。
来看一段代码,看看它是怎么进行数据验证就明白了。
public void setName(String name) {
if (name.length() >= 2 && name.length() <= 4) {
this.name = name;
}else{
System.out.println("输入的名字长度只能有2-4个字符");
}
}
这是一段给名字赋值的set方法,在方法中我们加入了if-else语句来确定赋值的条件,满足条件才会赋值成功,否则提示错误信息,这就是数据验证。保证了安全和合理性。
3.封装的实现步骤(三步)
- 将属性进行私有化private
- 提供一个公共的(public)set方法,用于对属性判断并赋值,其形式如下
public void setXxx(参数类型 参数名){
//加入数据验证的业务逻辑
属性 = 参数名;
} - 提供一个公共的(public)get方法,用于获取属性的值。其形式如下
public 属性类型 getXxx(){
return xx;
}
4.封装案例:银行账户
1.案例需求
看一个案例来理解封装的具体实现。案例需求如下:
1.创建程序,在其中定义两个类:Account和AccountTest类体会Java的封装性。 2.Account类要求具有属性:姓名(长度为2位3位或4位)、余额(必须>20)、 3.密码(必须是六位),如果不满足,则给出提示信息,并给默认值(程序员自己定) 4.通过setXxx的方法给Account的属性赋值。 5.在AccountTest中测试
2.代码实现
1.Account类
public class Account {
//定义账户属性,设为private类型,不允许随意更改
private String name;
private double bal;
private String pw;
//get方法获取属性值
public String getName() {
return name;
}
//set方法为属性赋值
public void setName(String name) {
if (name.length() >= 2 && name.length() <= 4) {
this.name = name;
}else{
System.out.println("输入的名字长度只能有2-4个字符");
}
}
public double getBal() {
return bal;
}
public void setBal(double bal) {
if (bal > 20) {
this.bal = bal;
}else{
System.out.println("请输入余额至少大于20");
}
}
public String getPw() {
return pw;
}
public void setPw(String pw) {
if (pw.length() == 6) {
this.pw = pw;
}else {
this.pw = "000000";
System.out.println("密码(必须是六位)默认密码为000000");
}
}
public String info() {
// 可以增加权限的校验
if (name == "bank") {
System.out.println("账号信息name=" + name + " 余额=" + bal + " 密码"+pw);
} else {
System.out.println("你无权查看...");
}
return "谢谢使用";
}
}
2.AccountTeest类
public class AccountTest {
public static void main(String[] args) {
//定义一个账户对象
Account a = new Account();
//调用set方法为属性赋值
a.setName("bank");
a.setBal(50);
a.setPw("123456");
System.out.println(a.info());
}
}
5.将构造器和setXxx方法结合
按照传统的封装方法去赋值,一个属性要调用一次set方法,我们将构造器和set结合起来,在创建对象时直接赋值。效率就会提高很多。
将上述代码改一下,对照来看。
1.Account类
public class Account {
//定义账户属性,设为private类型,不允许随意更改
private String name;
private double bal;
private String pw;
//这里增加一个构造器
public Account(String name,int bal,String pw){
//把set方法写在构造器中
setName(name);
setBal(bal);
setPw(pw);
}
//get方法获取属性值
public String getName() {
return name;
}
//set方法为属性赋值
public void setName(String name) {
if (name.length() >= 2 && name.length() <= 4) {
this.name = name;
}else{
System.out.println("输入的名字长度只能有2-4个字符");
}
}
public double getBal() {
return bal;
}
public void setBal(double bal) {
if (bal > 20) {
this.bal = bal;
}else{
System.out.println("请输入余额至少大于20");
}
}
public String getPw() {
return pw;
}
public void setPw(String pw) {
if (pw.length() == 6) {
this.pw = pw;
}else {
this.pw = "000000";
System.out.println("密码(必须是六位)默认密码为000000");
}
}
public String info() {
// 可以增加权限的校验
if (name == "bank") {
System.out.println("账号信息name=" + name + " 余额=" + bal + " 密码"+pw);
} else {
System.out.println("你无权查看...");
}
return "谢谢使用";
}
}
2.AccountTest类
public class AccountTest {
public static void main(String[] args) {
Account a = new Account("bank",50,"123456");
System.out.println(a.info());
}
}
这样我们不仅把实现细节都封装在了Account类,且赋值过程也变得简洁高效。
以上就是封装的全部内容。感谢阅读。