• 类与对象(十六)----封装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之间");
            }
        }
    }
    
  • 相关阅读:
    Java Websocket 01: 原生模式 Websocket 基础通信
    Optional .ofNullable()和flatMap()构造请求参数
    学习STM32(2)--STM32单片机GPIO应用
    js正则表达式之中文验证(转)
    Android优化RecyclerView图片展示:Glide成堆加载批量Bitmap在RecyclerView成片绘制Canvas,Kotlin(b)
    Django笔记三十之log日志记录详解
    Java基础(1)——ThreadLocal
    TP4067带电池反接保护500MA线性锂电池充电芯片
    两张图完全理解单点登录
    作用域,基本数据类型(常量const),转义字符,单引号与双引号,运算符
  • 原文地址:https://blog.csdn.net/WINorYU/article/details/127089407