官方定义:一种将抽象性函式接口的实作细节部份包装、隐藏起来的方法。封装可以被认为是一个保护屏障,防止该类的代码和数
据被外部类定义的代码随机访问。

大白话定义:通过getter和setter方法访问私有的在成员变量。

功能:

1、更容易修改自己的实现代码,而不用修改那些调用我们代码的程序片段。

2、可以对成员变量进行更精确的控制。

例子:
1、更容易修改自己的实现代码,而不用修改那些调用我们代码的程序片段。
eg. 把下列age类型从 int 改成 String。

 class Husband{
public int age; // public
public String name;
} class Wife{
private int age; // private
private String name; void setAge(int age){
this.age = age;
} void setName(String name){
this.name = name;
} int getAge(){
return age;
} String getName(){
return name;
} } public class TestEncapsulation {
public static void main(String[] args) {
Husband h1 = new Husband();
h1.age = 21;
h1.name = "a1"; Husband h2 = new Husband();
h2.age = 22;
h2.name = "a2"; Wife w1 = new Wife();
w1.setAge(18);
w1.getAge(); Wife w2 = new Wife();
w2.setAge(19);
w2.getAge(); System.out.println(h1.age);
System.out.println(w2.getAge()); }
}

改:Husband 类 要改外设调用程序;Wife 类需内改动。同时,假设有100个Husband对象和100个Wife对象,显然改Wife 类要容易。

1 class Husband{
2 public String age; // 改成 String
3 public String name;
4 }
5
6 class Wife{
7 private String age; // 改成 String
8 private String name;
9
10 void setAge(int age){
11 this.age = String.valueOf(age);
12 }
13
14 void setName(String name){
15 this.name = name;
16 }
17
18 String getAge(){ // 改成 String
19 return age;
20 }
21
22 String getName(){
23 return name;
24 }
25
26 }
27
28
29 public class TestEncapsulation {
30 public static void main(String[] args) {
31 Husband h1 = new Husband();
32 h1.age = “21”; // 改调用程序
33 h1.name = "a1";
34
35 Husband h2 = new Husband();
36 h2.age = "22";
37 h2.name = "a2";
38
39
40 Wife w1 = new Wife();
41 w1.setAge(18);
42 w1.getAge();
43
44 Wife w2 = new Wife();
45 w2.setAge(19);
46 w2.getAge();
47
48
49
50 System.out.println(h1.age);
51 System.out.println(w2.getAge());
52
53 }
54 }

2、可以对成员变量进行更精确的控制。

eg. 对于Husband类的 age 属性可能会误操作成

Husband  h1 = new Husband();
h1.age = ; // hi.age = -20;
h1.name = "a1";

可以通过setter方法来避免这类错误

void setAge(int age){
if(age<0||age>120){
System.out.println("age is wrong!");
}else{
this.age = age;
}
}
05-07 13:43