封装的概念
现实生活中,封装的例子随处可见,如药店出售的胶囊类药品,我们只能看到胶囊,却看不到胶囊的材料和生厂工序;邮递的包裹,我们只能看到包裹外部的包装,却看不到里面的物品;电视机可以收看电视节目,却看不到电视机的组装技术等,这些都是现实生活中的封装。
封装是面向对象的三大特性之一,它 指的是将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对家内部信息,而是通过该类所提供的方法实现对内部信息的操作和访问。
封装是面向对象编程语言对客观世界的模拟,客观世界中的属性均被隐藏在对象内部,外界无法直接操作和修改,如人的年龄属性只能随岁月的流逝而增加,通常不能随意修改人的年龄。对一个类或对象实现良好的封装, 可以实现以下目的:
(1)隐藏类的实现细节。
(2)让使用者只能通过事先预定的方法访问数据,从而可以在该方法中加入控制逻辑,限制对属性的不合理访
(3)可进行数据检查,从而有利于保证对象信息的完整性。
(4)便于修改,提高代码的可维护性。
实现良好的封装,需要从以下两个方面考虑:
(1)隐藏对象的属性和实现细节,不允许外部直接访问。
(2)暴露出方法,让方法控制对这些属性进行安全的访问和操作。
因此,封装实际上有两个方面的含义:隐藏该隐藏的,暴露该暴露的。这两个方面都需要通过使用Java提供的访问控制符来实现。
程序中的封装具体操作见示例
(1)创建Hero类,用于封装信息,代码如下:
public class Hero{
//使用private修饰属性,隐藏这些属性
private String name;
private int age;
public void setName(String name){
//执行合理校验,要求用户名必须在2 ~ 6之间
if(name length()> 6||name .length()<2){
System. out println(" 你输入的名字不符合要求 ");
return;
}elsef{
this.name = name;
}
}
public String getName() {
return name;
//提供方法操作age属性
public void setAge(int age) {
//执行合理校验,要求用户年龄必须在0 ~ 100之间if(age>100 || age<0)
System. out .printIn("你输入的年龄不合法")
return;
}else{
this.age= age;
}
}
public int getAge() {
return age;
}
}
(2)创建HeroTest类,具体代码如下:
public class HeroTest {
public static void main(String[l args){
Hero hero=new Hero();
//因为Hero类中的age属性被隐藏,所以下述语句将出现编译错误
//hero.age= 1000;
”下述语句不会出现编译错误,但运行时将提示“您输入的年龄不合法”
//程序不会修改hero的age属性值
hero. setAge(1000);
//因为之前未成功设置hero的age属性,因此输出值为0
System. out. printIn("未成功设置age属性值时age属性值:” +hero getAge());
//成功修改hero的age属性
hero. setAge(30);
//因为之前成功设置了hero的age属性值,因此输出值为30
System.out. println("成功设置age属性值后age属性值:" +hero getAge());
hero.setName("恶魔巫师");
System.out. printin("成功设置name值后name属性值:" +hero.getName0);
通过上述程序,可以发现将类进行合理的封装,非常有助于提高程序的健壮性与合理性。