隐藏和封装
2015-11-29 12:48
155 查看
我们有时候会见到一些程序代码通过某个对象直接访问其属性的情形,这可能引起一些潜在的问题:如将某个Person的age属性
直接设为100,这在语法上没有任何问题,但显然违背了现实。因此,Java程序推荐将类和对象的属性进行封装。
封装是面向对象三大特征之一(另外两个是继承和多态),它指的是将对象的现状信息封装在对象内部,不允许外部程序
直接访问对象内部信息,而是通过该类所提供的方法来实现对内部信息的操作和访问。
对一个类和对象实现良好的封装,可以实现以下目的:
== 隐藏类的实现细节
== 让使用者只能通过事先预定好的方法来访问数据,从而可以在该方法里加入控制逻辑,限制对属性的不合理访问。
== 可进行数据检查,从而有利于保证对象信息的完整性。
== 便于修改,提高代码的可维护性。
为了实现良好的封装,需要从两个方面考虑:
== 将对象的属性和实现细节隐藏起来,不允许外部直接访问。
== 把方法暴漏出去,让方法来操作或访问这些属性。
下面是一个demo
[java] view
plaincopy
public class Person {
private String name;
private int age;
/***
* 提供方法来操作name属性
*
* @param name
*/
public void setName(String name) {
// 执行合理性校检,要求用户名必须在2·6位之间
if (name.length() > 6 || name.length() < 2) {
System.out.println("您设置的人名不符合要求");
return;
} else {
this.name = name;
}
}
public String getName(){
return name;
}
/**
* 提供方法来操作age属性
* @param age
*/
public void setAge(int age){
if(age > 100 || age< 0){
System.out.println("您设置的年龄不符合要求");
return;
}else{
this.age=age;
}
}
public int getAge(){
return age;
}
}
[java] view
plaincopy
public static void main(String[] args) {
Person p = new Person();
/** 因为age的属性已经被隐藏,所以下面语句将出现编译错误 */
// p.age=100;
/** 下面的代码不会出现编译错误,但是会提示age属性不符合要求,程序不会修改age的属性 */
p.setAge(10000);
System.out.println(p.getAge());//此处输出为0
p.setAge(30);
System.out.println(p.getAge());//此处输出为30,修改了age属性
}
定义了上面的Person类后,该类的name和age属性只能在Person内才可以进行操作
和访问,在Person类之外只能通过各自对应的setter和getter方法来操作和访问
直接设为100,这在语法上没有任何问题,但显然违背了现实。因此,Java程序推荐将类和对象的属性进行封装。
封装是面向对象三大特征之一(另外两个是继承和多态),它指的是将对象的现状信息封装在对象内部,不允许外部程序
直接访问对象内部信息,而是通过该类所提供的方法来实现对内部信息的操作和访问。
对一个类和对象实现良好的封装,可以实现以下目的:
== 隐藏类的实现细节
== 让使用者只能通过事先预定好的方法来访问数据,从而可以在该方法里加入控制逻辑,限制对属性的不合理访问。
== 可进行数据检查,从而有利于保证对象信息的完整性。
== 便于修改,提高代码的可维护性。
为了实现良好的封装,需要从两个方面考虑:
== 将对象的属性和实现细节隐藏起来,不允许外部直接访问。
== 把方法暴漏出去,让方法来操作或访问这些属性。
下面是一个demo
[java] view
plaincopy
public class Person {
private String name;
private int age;
/***
* 提供方法来操作name属性
*
* @param name
*/
public void setName(String name) {
// 执行合理性校检,要求用户名必须在2·6位之间
if (name.length() > 6 || name.length() < 2) {
System.out.println("您设置的人名不符合要求");
return;
} else {
this.name = name;
}
}
public String getName(){
return name;
}
/**
* 提供方法来操作age属性
* @param age
*/
public void setAge(int age){
if(age > 100 || age< 0){
System.out.println("您设置的年龄不符合要求");
return;
}else{
this.age=age;
}
}
public int getAge(){
return age;
}
}
[java] view
plaincopy
public static void main(String[] args) {
Person p = new Person();
/** 因为age的属性已经被隐藏,所以下面语句将出现编译错误 */
// p.age=100;
/** 下面的代码不会出现编译错误,但是会提示age属性不符合要求,程序不会修改age的属性 */
p.setAge(10000);
System.out.println(p.getAge());//此处输出为0
p.setAge(30);
System.out.println(p.getAge());//此处输出为30,修改了age属性
}
定义了上面的Person类后,该类的name和age属性只能在Person内才可以进行操作
和访问,在Person类之外只能通过各自对应的setter和getter方法来操作和访问
相关文章推荐
- ORA-12154: TNS: 无法解析指定的连接标识符
- HTML5 localStorage 本地存储
- [ecshop 资料] ecshop 地址 增加 镇 68ecshop版本
- leetcode Set Matrix Zeroes 代码解析
- 成员变量和局部变量
- HDU1097
- 王小云
- hdoj 5587 Array 【思维】
- unravel中文音译
- win10管理员已阻止你运行此应用”解决方法
- 程序员必备:Linux日常维护命令
- hdoj 5586 Sum 【dp】
- hdoj 5585 Numbers 【水题】
- 类和对象
- 图片测试1
- “滑机约拍”--第二阶段冲刺(1)
- yum安装syslog-ng3.6
- 实习过程学习(2):maven杂记
- 字节对齐(struct 和 union)
- HFSS 边界条件