封装

首先,我们要想一个问题——为什么要进行封装?

以下面代码为例:

Person p = new Person();
p.age = 1000;

在给属性赋值时,设置了一个不合理的值,这样就会导致对象的信息失效,为了避免出现这种问题,我们便要对齐进行封装。

封装的概念:

封装(Encapsulation),是面向对象方法的重要原则,也是面向对象三大特征之一。

其作用是将类的某些属性和操作(服务)结合成一个独立的个体隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问。

例如:一台计算机内部极其复杂,有主板、CPU、硬盘和内存, 而一般用户不需要了解它的内部细节,不需要知道主板的型号、CPU 主频、硬盘和内存的大小,于是计算机制造商将用机箱把计算机封装起来,对外提供了一些接口,如鼠标、键盘和显示器等,这样当用户使用计算机就非常方便。

 适当的封装可以让程式码更容易理解和维护,也加强了程式码的安全性。

封装的好处:

  • 隐藏类的实例细节,方便修改和实现,也增强了代码的可维护性
  • 防止对封装数据的未经授权的访问
  • 有利于保证数据的完整性
  • 只能通过规定的方法访问数据

该如何进行封装呢?

封装的步骤:

  1. 通过修改属性的访问修饰符,即修改属性的可见性来限制对属性的访问。一般而言,是将可见性设为(private)。
  2. 为每个属性创建一对公有的赋值(setter)方法和取值(getter)方法,一般设为 public,用于属性的读写。(通过这两种方法对数据进行获取和设定,对象通过调用这两种发方法实现对数据的读写)
  3. 在赋值(setter)方法/取值(getter)方法中加入属性控制语句。(对属性值的合法性进行判断)

访问修饰符:
private:只能在本类中使用(正因为private中的元素不能在外面直接访问,所以才利用调用getter/setter方法访问)
默认:本来和同包中使用
protected:本类,同包,子类中使用
public:本类,同包,子类,其他中都可以使用

封装的应用

封装是把过程和数据包围起来,对数据的访问只能通过已定义的接口,封装是一种信息隐藏技术,我们将属性与方法封装到类中 ,将功能的多行代码封装到一个方法中 ,Java将很多功能封装到了工具类中,我们直接使用工具类来完成某些功能 ,我们把一个项目打包成jar包,提供给其他项目使用。

实例:

下面以一个学生类的封装为例介绍封装的过程。

一个大学生的主要属性有姓名、年龄、联系电话和班级。假设学生类为Student。


package com.company;
public class Student
{
    private String name; // 姓名
    private int age; // 年龄
    private String phone; // 联系电话
    private int num; //班级号

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }


    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        // 对年龄进行限制
        if (age < 16 || age > 24) {
            System.out.println("年龄必须在16到24之间!");
            this.age = 20; // 默认年龄
        } else {
            this.age = age;
        }
    }


    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }


    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }
}


如上述代码所示,使用 private

但是,可以通过这些属性的赋值(setter)方法来对其进行赋值,通过取值(getter)方法来访问这些属性。

在 age 属性的 setAge() 方法中,首先对用户传递过来的参数 age 进行判断,如果 age 的值不在 16到24之间,则将Student类的 age 属性值设置为 20,否则为传递过来的参数值。

编写测试类 StudentTest,在该类中调用Student属性的赋值(setter)方法对其相应的属性进行赋值,并调用取值(getter)方法访问属性,代码如下:

package com.company;
public class StudentTest
{
    public static void main(String[] args)
    {
        Student people = new Student();
        people.setName("小魏");
        people.setAge(20);
        people.setPhone("18000835964");
        people.setNum(24);
        System.out.println("姓名:" + people.getName());
        System.out.println("年龄:" + people.getAge());
        System.out.println("电话:" + people.getPhone());
        System.out.println("班级" + people.getNum());
    }
}

运行效果为:

java 协议封装 java封装原则_java