类与对象(十六)----封装encapsulation

封装的概念

面向对象三大巨头知识点----封装
在日常生活中,会使用到的电视机就是封装的典型案例。
用户使用的工具为 遥控器,开关机键,声音调节键,换台键。这些操作步骤,用户轻轻点下遥控器上的按键即可实现。但是实际上这些功能背后的操作远远不止这些。还需要电视机内部的信号接收器与其他元件配合,才能完成。那么将这些电视机内部的操作隐藏起来,只给用户提供一个遥控器作为操作。这就是一种封装。

在java中就是将抽象的数据(属性)和对数据的操作(方法)封装在一起,数据被保护在内部,只有通过对外提供的被授权的操作(方法)才可以对数据进行操作。

封装的好处

  • 隐藏实现细节
  • 可以对数据进行验证,保证安全性合理性

封装的步骤

将数据封装起来,就相当于把重要的东西放进保险柜里。
一般使用保鲜柜存钱有以下步骤:
打开保险柜 钱放进去 设置密码 关上保险柜
那么再想使用这笔钱的时候就不能直接拿了,得输入密码验证。同理在java中也有一系列的步骤

  1. 将数据保护起来,使用private修饰符修饰数据,这样就只能本类才能调用
  2. 设置对外授权的使用或者改动方法,在本类使用public 修饰符设置set和get方法,用于改动获取受保护的数据(这样就可以在其他类或其他包获取设置保护的数据)

封装入门案例

要求写出以下调节的封装,以便理解
1.在Person类中封装了 隐私信息(年龄,薪水)
2.要求别的类要设置隐私信息时,必须符合一定的合理性(年龄不能超过120小于1,名字不能超过4个字符串小于2个字符)

public class EncTest01 {
    public static void main(String[] args) {
        Person p1 = new Person();
        p1.setName("古海");
        p1.setAge(25);
        p1.setSalary(58000);
        System.out.println("p1的信息为:名字"+p1.getName()+"年龄"+p1.getAge()+"薪水"+p1.getSalary()+"/月");

    }
}
class Person{
    public String name;//名字公开
    private int age;
    private double salary;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        if (name.length() >= 2 &&name.length() <= 4) {
            this.name = name;
        }else{
            System.out.println("请输入正确的名字");
            this.name = "erro";
        }
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        if (age >= 1 && age <= 120) {
            this.age = age;
        }else{
            System.out.println("请输入正常的年龄");
        }
    }

    public double getSalary() {
        //如果想别人不是那么简单就获取到薪水金额,可以在这里设置类似密码的关卡
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }
}

封装个人小结

理解:封装在代码的操作中就是 通过private修饰符和public修饰符的合作搭配来保护数据,提供可操作的方法。
原理:private修饰的数据虽然只能在本类中调用,但是如果再在本类写一个用public修饰符的方法,然后在这个方法里调用private修饰的数据。这样就可以在别的类甚至不同包的类都可以通过这个public的方法获取和设置受保护的数据了

封装关键字释义:private 私有数据修饰符
set方法:设置私有数据的方法,一般都会在里面设置一些符合条件才能设置的代码
get方法:获取到私有数据的方法,同理也会写符合权限才能获取的代码

封装与构造器

在上面的入门案例中成功的将隐私数据保护起来了,但是如果在构造器中也写了接收隐私数据且修改的代码,就会绕过之前在set方法中写的合理性约束。

public Person(String name,int age,double salary){
this,name = name;
this,age= age;
this,salary = salary;
}

这样写的话,就算在set方法写了制约条件,也会直接跳过进行修改。
那么为了维持保护数据依旧安全,可以在构造器中的赋值代码变成调用set方法进行赋值。

public class EncTest01 {
    public static void main(String[] args) {
        Person p1 = new Person("古海",250,50000);

        System.out.println("p1的信息为:名字"+p1.getName()+"年龄"+p1.getAge()+"薪水"+p1.getSalary()+"/月");

    }
}
class Person{
    public String name;//名字公开
    private int age;
    private double salary;
	//构造器也使用set方法进行赋值
    public Person(String name,int age,double salary) {
        setName(name);
        setAge(age);
        setSalary(salary);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        if (name.length() >= 2 &&name.length() <= 4) {
            this.name = name;
        }else{
            System.out.println("请输入正确的名字");
            this.name = "erro";
        }
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        if (age >= 1 && age <= 120) {
            this.age = age;
        }else{
            System.out.println("请输入正常的年龄");
        }
    }

    public double getSalary() {
        //如果想别人不是那么简单就获取到薪水金额,可以在这里设置类似密码的关卡
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }
}

这样就维持了安全性,同理也可以写根据传入的不同参数重载不同参数的构造器,只要内部还是使用set方法就可以

封装练习

  • 定义两个类,Account和AccountTest体会java的封装性
  1. Account类要求具有属性:姓名(长度为2位~4位)余额:(必须>20)密码(必须是六位),如果不满足则提示
  2. 通过set方法给Account属性赋值
  3. 在AccountTest中测试
public class AccountTest {
    public static void main(String[] args) {
        Account a1 = new Account();
        a1.setName("大老二");
        a1.setBalance(6000000);
        a1.setPass("ui123442");
        System.out.println("a1的信息为:"+a1.getName()+"密码:"+a1.getPass()+"账户余额:"+a1.getBalance());
    }
}
class Account{
    private String name;
    private double balance;
    private String pass;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        if (name.length() <= 4 && name.length() >= 2) {
            this.name = name;
        }else{
            System.out.println("名字长度需要在2~4之间,请重新输入");
        }
    }

    public double getBalance() {
        return balance;
    }

    public void setBalance(double balance) {
        if (balance >= 20) {
            this.balance = balance;
        }else{
            System.out.println("这点钱就算了");
        }
    }

    public String getPass() {
        return pass;
    }

    public void setPass(String pass) {
        if (pass.length() >= 6 && pass.length()<= 16) {
            this.pass = pass;
        }else{
            System.out.println("密码长度需要在6~16之间");
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值