隐藏和封装

来源:互联网 发布:c语言编程小游戏 编辑:程序博客网 时间:2024/05/14 02:19
我们有时候会见到一些程序代码通过某个对象直接访问其属性的情形,这可能引起一些潜在的问题:如将某个Person的age属性
直接设为100,这在语法上没有任何问题,但显然违背了现实。因此,Java程序推荐将类和对象的属性进行封装。

封装是面向对象三大特征之一(另外两个是继承和多态),它指的是将对象的现状信息封装在对象内部,不允许外部程序
直接访问对象内部信息,而是通过该类所提供的方法来实现对内部信息的操作和访问。

对一个类和对象实现良好的封装,可以实现以下目的:
== 隐藏类的实现细节
== 让使用者只能通过事先预定好的方法来访问数据,从而可以在该方法里加入控制逻辑,限制对属性的不合理访问。
== 可进行数据检查,从而有利于保证对象信息的完整性。
== 便于修改,提高代码的可维护性。
为了实现良好的封装,需要从两个方面考虑:
== 将对象的属性和实现细节隐藏起来,不允许外部直接访问。
== 把方法暴漏出去,让方法来操作或访问这些属性。

下面是一个demo

[java] view plaincopy
  1. public class Person {  
  2.   
  3.     private String name;  
  4.     private int age;  
  5.   
  6.     /*** 
  7.      * 提供方法来操作name属性 
  8.      *  
  9.      * @param name 
  10.      */  
  11.     public void setName(String name) {  
  12.         // 执行合理性校检,要求用户名必须在2·6位之间  
  13.         if (name.length() > 6 || name.length() < 2) {  
  14.             System.out.println("您设置的人名不符合要求");  
  15.             return;  
  16.         } else {  
  17.             this.name = name;  
  18.         }  
  19.     }  
  20.     public String getName(){  
  21.         return name;  
  22.     }  
  23.     /** 
  24.      * 提供方法来操作age属性 
  25.      * @param age 
  26.      */  
  27.     public void setAge(int age){  
  28.         if(age > 100 || age< 0){  
  29.             System.out.println("您设置的年龄不符合要求");  
  30.             return;  
  31.         }else{  
  32.             this.age=age;  
  33.         }  
  34.     }  
  35.     public int getAge(){  
  36.         return age;  
  37.     }  
  38.       
  39.       
  40.       
  41. }  

[java] view plaincopy
  1. public static void main(String[] args) {  
  2.         Person p = new Person();  
  3.         /** 因为age的属性已经被隐藏,所以下面语句将出现编译错误 */  
  4. //      p.age=100;  
  5.           
  6.           
  7.         /** 下面的代码不会出现编译错误,但是会提示age属性不符合要求,程序不会修改age的属性 */  
  8.         p.setAge(10000);  
  9.           
  10.         System.out.println(p.getAge());//此处输出为0  
  11.           
  12.         p.setAge(30);  
  13.         System.out.println(p.getAge());//此处输出为30,修改了age属性  
  14.           
  15.     }  

定义了上面的Person类后,该类的name和age属性只能在Person内才可以进行操作
和访问,在Person类之外只能通过各自对应的setter和getter方法来操作和访问
0 0
原创粉丝点击