• 4-9封装与隐藏


    为什么需要封装?封装的作用和含义?

     我要用洗衣机,只需要按一下开关和洗涤模式就可以了。有必要了解洗衣机内
    部的结构吗?有必要碰电动机吗?
     我要开车,…
     我们程序设计追求“高内聚,低耦合”。
     高内聚 :类的内部数据操作细节自己完成,不允许外部干涉;
     低耦合 :仅对外暴露少量的方法用于使用。
     隐藏对象内部的复杂性,只对外公开简单的接口。便于外界调用,从而提
    高系统的可扩展性、可维护性。通俗的说,把该隐藏的隐藏起来,该暴露
    的暴露出来。这就是封装性的设计思想。

    面向对象的特征一:封装与隐藏

    一、问题的引入:

    • 当我们创建一个类的对象以后,我们可以通过"对象.属性"的方式,对对象的属性进行赋值。这里,赋值操作要受到
    • 属性的数据类型和存储范围的制约。但除此之外,没有其他制约条件。但是,实际问题中,我们往往需要给属性赋值
    • 加入额外限制条件。这个条件就不能在属性声明时体现,我们只能通过方法进行条件的添加。比如说,setLegs
    • 同时,我们需要避免用户再使用“对象.属性”的方式对属性进行赋值。则需要将属性声明为私有的(private)
    • –》此时,针对于属性就体现了封装性。

    二、封装性的体现:

    • 我们将类的属性私有化(private),同时,提供公共的(public)方法来获取(getXxx)和设置(setXxx)

    • 拓展:封装性的体现:① 如上 ② 单例模式 ③ 不对外暴露的私有方法

    /*
    * 为什么需要封装?封装的作用和含义?
     我要用洗衣机,只需要按一下开关和洗涤模式就可以了。有必要了解洗衣机内
    部的结构吗?有必要碰电动机吗?
     我要开车,…
     我们程序设计追求“高内聚,低耦合”。
     高内聚 :类的内部数据操作细节自己完成,不允许外部干涉;
     低耦合 :仅对外暴露少量的方法用于使用。
     隐藏对象内部的复杂性,只对外公开简单的接口。便于外界调用,从而提
    高系统的可扩展性、可维护性。通俗的说,把该隐藏的隐藏起来,该暴露
    的暴露出来。这就是封装性的设计思想。
    * */
    /*
     * 面向对象的特征一:封装与隐藏
     * 一、问题的引入:
     *    当我们创建一个类的对象以后,我们可以通过"对象.属性"的方式,对对象的属性进行赋值。这里,赋值操作要受到
     *    属性的数据类型和存储范围的制约。但除此之外,没有其他制约条件。但是,实际问题中,我们往往需要给属性赋值
     *    加入额外限制条件。这个条件就不能在属性声明时体现,我们只能通过方法进行条件的添加。比如说,setLegs
     *    同时,我们需要避免用户再使用“对象.属性”的方式对属性进行赋值。则需要将属性声明为私有的(private)
     *    --》此时,针对于属性就体现了封装性。
     *
     * 二、封装性的体现:
     *    我们将类的属性私有化(private),同时,提供公共的(public)方法来获取(getXxx)和设置(setXxx)
     *
     *    拓展:封装性的体现:① 如上 ② 单例模式 ③ 不对外暴露的私有方法
     *
     */
    public class AnimalTest {
    
        public static void main(String[] args) {
            Animal a = new Animal();
            a.name = "大黄";
    //		a.age = 1;
    //		a.legs = 4;//The field Animal.legs is not visible
    
            a.show();
    
    //		a.legs = -4;
    //		a.setLegs(6);
            a.setLegs(-6);
    
    //		a.legs = -4;//The field Animal.legs is not visible
            a.show();
    
            System.out.println(a.name);
            System.out.println(a.getLegs());
        }
    }
    class Animal{
    
        String name;
        private int age;
        private int legs; //腿的个数
    
        //对于属性的设置
        public void setLegs(int l){
            if(l >= 0 && l % 2 == 0){
                legs = l;
            }else{
                legs = 0;
            }
        }
    
        //对于属性的获取
        public int getLegs(){
            return legs;
        }
    
        public void eat(){
            System.out.println("动物进食");
        }
    
        public void show(){
            System.out.println("name = " + name + ",age = " + age + ",legs = " + legs);
        }
    
        //提供关于属性 age 的 get 和 set 方法
        public int getAge(){
            return age;
        }
    
        public void setAge(int a){
            age = a;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
  • 相关阅读:
    XenServer 6.2部署教程
    macOS monterey 12.6.1安装homebrew + nginx + php + mysql
    K8S Service
    PYTHON 120道题目详解(115-117)
    最新最全面的Spring详解(一)——Spring概述与IOC容器
    matlab中的隐马尔可夫模型(HMM)实现
    数据库系统原理与应用教程(042)—— MySQL 查询(四):使用通配符构造查询条件
    作为所有类的顶层父类,没想到Object的魔力如此之大!
    大模型的幻觉 (Hallucination) 因何而来?如何解决幻觉问题?
    FastAPI 学习之路(一)fastapi--高性能web开发框架
  • 原文地址:https://blog.csdn.net/qq_44774198/article/details/125513470