# 封装

封装是面向对象的三大特征之一,什么是封装?封装有什么好处?怎么封装,代码怎么写?

封装就是指利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体,数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只保留一些对外接口使之与外部发生联系。其他对象只能通过包裹在数据外面的已经授权的操作来与这个封装的对象进行交流和交互。也就是说用户是无需知道对象内部的细节,但可以通过该对象对外提供的接口来访问该对象。

就是将成员变量和成员方法封装在一起,使其成为一个单独的实体,并尽可能隐藏对象的内部实现细节,也就是对成员变量进行访问控制,只能通过对外开放的接口(方法)访问。

封装之后就形成了独立实体,独立实体可以在不同的环境中重复使用,显然封装可以降低程序的耦合度,提高程序的扩展性,以及重用性或复用性。

在 java 中虽然可以在一个 .java 源文件中 可以写多个类,但一般不建议这样做,一般建议单独写一个类,然后在其他类中引用该类。

如下新建一个 Production 商品实体类,也就是封装成单独的类:

public class Production {
    private String name;
    private int no;

    public void Production() {
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
    public void setNo(int no) {
        this.no = no;
    }
    public int getNo() {
        return no;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

public class FengZhuang {
    public static void main(String[] args) {
        // Student
        Student s = new Student();
        s.name="张三";
        System.out.println(s.name); // 张三
        s.name="李四";
        System.out.println(s.name); // 李四
        // Student2
        Student2 s2 = new Student2();
        // 赋值
//        s2.name="张三"; // 报错 name 在 Student2 中是 private 访问控制
        // 取值
//        System.out.println(s2.name); // 报错 name 在 Student2 中是 private 访问控制

        s2.setName("张三");
        System.out.println(s2.getName()); // 张三

        //将商品类单独封装成一个实体类 成员变量也做private访问控制只能通过指定的方法获取或者赋值
        Production p = new Production();
        // p.name = "iphone'; // 报错 name 在 Production 中是 private 访问控制
        p.setName("iphone");
        System.out.println(p.getName());
    }
}

// 成员变量未做 访问控制 默认是 public,可以被外部类访问(未封装)
class Student {
    // 姓名
    String name;
    // 年龄
    int age;
    // 学号
    int no;
    // 是否合格
    boolean isPass;
}

// 成员变量做了 private 私有访问控制,只能被本类访问(封装)
class Student2 {
    // 姓名
    private String name;
    // 年龄
    private int age;
    // 学号
    private int no;
    // 是否合格
    private boolean isPass;
    // 对外开放获取 name 成员变量的方法
    public String getName() {
        return name;
    }
     // 对外开放设置 name 成员变量的方法
    public void setName(String name) {
        this.name = name;
    }
}
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

在java语言中封装的步骤:

  1. 需要被保护的属性使用private进行修饰,
  2. 给私有的属性对外提供公开的set和get方法,其中set方法用来修改属性的值,get方法用来读取属性的值。
  3. set和get方法在命名规范要求set方法名是set + 属性名(属性名首字母大写),get方法名是get + 属性名(属性名首字母大写)。 其中set方法有一个参数,用来给属性赋值,set方法没有返回值,一般在set方法内部编写安全控制程序,因为毕竟set方法是修改内部数据的,而get方法不需要参数,返回值类型是该属性所属类型(先记住,以后讲:另外set方法和get方法都不带static关键字,不带static关键字的方法称为实例方

备注:

  • private 表示私有的 只能在本类内部使用,不能在类外部使用
  • public 表示公有的 可以在本类内部使用,也可以在类外部使用
  • 一般封装的实体类中,成员变量都是 private 私有的,方法一般是 public 公有的