0808-Java OOP面向对象的Java实现 封装

来源:互联网 发布:淘宝手机端网址转化 编辑:程序博客网 时间:2024/06/04 18:53
 什么是封装
封装就是将属性私有化,提供共有的方法访问私有属性。
做法:
(1)修改属性的可见性来限制对属性的访问.
(2)为每个属性创建一对取值get()方法和赋值set()方法,用于对这些属性的访问。

如下面示例所示:
****************************************
      AccpTeacher2类
****************************************
01 package s2Java.sg.ch01;
02 public class AccpTeacher2 {
03   private String name; // 教员姓名
04   private int age;      // 教员年龄
05   
06   public String getName() {
07     return name;
08   }
09   
10   public void setName(String name) {
11     this.name = name;
12   }
13   
14   public int getAge() {
15     return age;
16   }
17   
18   public void setAge(int age) {
19     this.age = age;
20   }
21   
22   /**
23    * 返回自我介绍的内容
24    */
25   public String introduction() {
26     return "大家好!我是" + name + ",我今年" + age + "岁。";
27   }
28 }

【注意】
this关键字的含义:在对象内部指代自身的引用。
因为this可以使你直接引用对象,你能用它来解决可能在实例变量和局部变量之间发生的任何同名
的冲突。如上面的代码中使用了this关键字,有效的解决了实例变量name与局部变量name之间发生
的同名冲突。

【提问】
使用private关键字修饰某个成员变量后,这个成员变量可以被同一包中的其它类访问吗?
【答案】
否。

上面的AccpTeacher2类中,使用了private关键字修饰属性,就意味着:除了AccpTeacher类本身,
其他所有类都不可以访问这些属性。但是,可以通过这些属性的取值get()方法、赋值set()方法
来访问这些属性。

****************************************
     AccpTeacher2Test类
****************************************
01 package s2Java.sg.ch01;
02 public class AccpTeacher2Test {
03   public static void main(String[] args) {
04     /* 对教员进行初始化 */
05     AccpTeacher2 teacher = new AccpTeacher2();
06     teacher.setName("李芳");
07     teacher.setAge(10);     // 显然年龄不符合要求
08     /* 输出自我介绍的内容 */
09     System.out.println(teacher.introduction());
10   }
11 }
运行结果:
大家好!我是李芳,今年10岁。

【分析】
此时,运行结果仍然不符合ACCP5.0教员的最小年龄限制,但是,只要在上述代码的基础上稍加改造,

就可以达到目的了。

如何实现封装

实际做法很简单,只需要在上述代码的基础上改造,即赋值方法中加入对属性访问限制的代码,就能够
实现ACCP5.0教员的最小年龄要求限制。代码如下:

【例3】
****************************************
      AccpTeacher3类
****************************************
01 package s2Java.sg.ch01;
02 public class AccpTeacher3 {
03   private String name; // 教员姓名
04   private int age;      // 教员年龄
05    
06   public String getName() {
07     return name;
08   }
09    
10   public void setName(String name) {
11     this.name = name;
12   }
13    
14   public int getAge() {
15     return age;
16   }
17    
18   public void setAge(int age) {
19     if (age < 22) {
20       System.out.println("错误!最小年龄应为22岁!");
21       this.age = 22;
22     } else {        
23       this.age = age;
24     }
25   }
26    
27   /**
28    * 返回自我介绍的内容
29    */
30   public String introduction() {
31     return "大家好!我是" + name + ",我今年" + age + "岁。";
32   }
33 }

在setAge()中,如果欲设置的年龄小于22岁,就打印错误信息,并把年龄设置为22岁。
现在,代码已满足了要求,测试类如下:

****************************************
     AccpTeacher3Test类
****************************************
01 package s2Java.sg.ch01;
02 public class AccpTeacher3Test {
03   public static void main(String[] args) {
04     /* 对教员进行初始化 */
05     AccpTeacher3 teacher = new AccpTeacher3();
06     teacher.setName("李芳");
07     teacher.setAge(10);     // 显然年龄不符合要求
08     /* 输出自我介绍的内容 */
09     System.out.println(teacher.introduction());
10   }
11 }
运行结果:
错误!最小年龄应为22岁!
大家好!我是李芳,我今年22岁。

【分析】
显然,通过封装,实现了对属性的数据访问限制,满足了ACCP5.0教员类的需求。
另外,同前面的代码相比,上述的代码中更改了对年龄设置的实现,但是由于
取值方法和赋值方法隐藏了实现的变更,因此并不会影响读取或修改该属性的
类,避免了大规模的修改,程序的可维护性增强。以上即“代码封装的好处”。

【总结】
实现封装的步骤:
(1)修改属性的可见性来限制对属性的访问。
(2)为每个属性创建一对赋值方法和取值方法,用于对这些属性的访问。
(3)在赋值和取值方法中,加入对属性的存取限制。

本文参考:https://tieba.baidu.com/p/989864909