Java OOP - 三大特性之封装性(Encapsulation)


封装(Encapsulation)是面向对象的一个重要特征,就是把对象的属性和操作(或服务)结合为一个独立的整体,并尽可能隐藏对象的内部实现细节。

通俗的讲所谓封装就是将属性和方法捆绑到一起,封装到一个对象中去, 形成一个不可分割的独立单位,以及尽可能隐藏对象的内部结构,也就是说,如果我们使用了封装技术的话,别人就只能用我们做出来的东西而看不见我们做的这个东西的内部结构了。

如果形容一个人(假设把人看做一个类),我们可以用姓名、年龄,性别等来描述,如果不封装我们需要三个变量来形容他,在面向对象中可以用一个person类来封装这些属性,person具有三个成员变量 ,name,age,sex,创建的时候每当生成一个这样的类的对象,就具有这3个属性。

还可以这么想比如一部电脑主机,他就是封装起来,你可以通过一些方法改变他里面的状态,而又不需要了解他的原理,比如我按下开机键,我会知道我按下这个键,电脑就会启动,而不需要了解他怎么运行

对于封装而言,一个对象它所封装的是自己的属性和方法,所以它是不需要依赖其他对象就可以完成自己的操作。

什么是封装?

封装就是将属性私有化,提供公有的方法访问私有属性。

做法就是:修改属性的可见性来限制对属性的访问,并为每个属性创建一对取值(getter)方法和赋值(setter)方法,用于对这些属性的访问。

实例:

    package com.yoodb.blog;
    
    public class User {
    private Integer id;
    private String name;
    
        public Integer getId() {
            return id;
        }
     
        public void setId(Integer id) {
            this.id = id;
        }
     
        public String getName() {
            return name;
        }
     
        public void setName(String name) {
            this.name = name;
        }
    }

为什么要封装、封装有什么作用?

通过封装,可以实现对属性的数据访问限制,同时增加了程序的可维护性;

由于取值方法和赋值方法隐藏了实现的变更,因此并不会影响读取或修改该属性的类,避免了大规模的修改,程序的可维护性增强。

对象的数据封装特性还可以把对象的私有数据和公共数据分离开,保护了私有数据,减少了可能的模块间干扰,达到降低程序复杂性、提高可控性的目的。

封装的好处与具体实现步骤

1)修改属性的可见性来限制对属性的访问;

2)为每个属性创建一对赋值方法和取值方法,用于对这些属性的访问;

3)在赋值和取值方法中,加入对属性的存取限制。

为了实现良好的封装性,我们通常将类的成员变量声明为private,再通过public的方法来对这个变量进行访问。对一个变量的操作,一般都有读取和赋值操作,我们分别定义两个方法来实现这两种操作,一个getXxx( )(Xxx表示要访问的成员变量的名字),用来读取这个成员变量操作,另外一个是setXxx()用来对这个成员变量赋值。**如果外面的程序可以随意修改一个类的成员变量,会造成不可预料的程序错误,就象一个人的身高,不能被外部随意修改,只能通过各种摄取营养的方法去修改这个属性。

演示代码

封装代码

简单封装实例:

    package com.yoodb.blog;
    
    public class AccpTeacher {
        private String name;
        private int age;
        public String getName() {
            return name;
        }
        public int getAge() {
            return age;
        }
        public void setName(String name,int age) {
            if (age > 200) {
                System.out.println(name + "年龄不符合,太大!");
            } else {
                this.age = age;
            }
            this.name = name;
        }
    }

测试代码

测试代码如下:

    package com.yoodb.blog;
    
    public class AccpTeacher {
        private String name;
        private int age;
        public String getName() {
            return name;
        }
     
        public int getAge() {
            return age;
        }
     
        public void setName(String name,int age) {
            if (age > 200) {
                System.out.println(name + "年龄不符合,太大!");
            } else {
                this.age = age;
            }
            this.name = name;
        }
    }

运行结果

运行结果如下:

    张三年龄是30岁

封装优点

1)隐藏类的实现细节,良好的封装能够减少耦合;

2)让使用者只能通过事先定制好的方法来访问数据,可以方便地加入控制逻辑,限制对属性的不合理操作,保证了程序的安全性;

3)便于修改,增强代码的可维护性。