面向对象编程(oop)三大特征之一:封装

本文详细介绍了封装的概念,如何通过权限修饰符实现属性私有化,以及数据验证的重要性。通过银行账户案例展示了封装在实际编程中的应用,包括使用set和get方法、构造器结合以及确保数据安全和合理操作。
摘要由CSDN通过智能技术生成

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.封装的实现步骤(三步)

  1. 将属性进行私有化private
  2. 提供一个公共的(public)set方法,用于对属性判断并赋值,其形式如下
    public void setXxx(参数类型 参数名){
         //加入数据验证的业务逻辑
         属性 = 参数名;
    }
  3. 提供一个公共的(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类,且赋值过程也变得简洁高效。


以上就是封装的全部内容。感谢阅读。

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值