封装与隐藏
一、程序追求“高内聚,低耦合”。
1.高内聚:类的内部数据操作细节自己完成,不允许外部干涉。
2.低耦合:仅对外暴露少量的方法用于使用。
3.隐藏对象内部的复杂性,只对外公开简单的接口。便于外界调用,从而提高系统的可扩展性、可维护性。通俗的说,把该隐藏的隐藏起来,该暴露的暴露出来,这就是封装性的涉及思想。
二、问题的引入
当我们创建一个类的对象以后,我们可以通过“对象.属性”的方式,对对象的属性进行赋值。这里,赋值操作要受到属性的数据类型和存储范围的制约。除此之外
没有其他制约条件。但是,在实际问题中,我们往往需要给属性赋值加入额外的限制条件。这个条件不能在属性声明时体现,我们只能通过方法进行限制条件的添加。(比如,setLegs)。
同时,我们需要避免用户再使用“对象.属性”的方式堆属性进行赋值。则需要将属性声明为私有的(private)
—>此时,针对于属性就体现了封装性。
三、封装性的体现:(不等于封装性)
我们将类的属性私有化(private),同时,提供公共的(public)方法来获取(getXxx)和设置(setXxx)此属性的值。
**拓展:**封装性的体现: ① 如上
②不对外暴露的私有的方法 ③ 单例模式……
代码:
public class AnimalTest {
public static void main(String[] args) {
Animal a = new Animal();
a.name = "大黄";
a.setAge(3);
System.out.println(a.getAge());
// a.legs = 4;//The field Animal.legs is not visible
a.setLegs(6);
a.show();
// a.legs = -4;//The field Animal.legs is not visible
a.setLegs(-2);
a.show();
System.out.println(a.name);
}
}
class Animal {
String name;
private int age;
private int legs;// 腿的个数
//private---->不能直接调用了,权限小---->封装性、隐藏性
//对属性的设置
public void setLegs(int l) {
if (l >= 0 && l % 2 == 0) {
legs = l;
} else {
legs = 0;// 最好是抛出一个异常,后续会学
}
}
//对属性的获取
public int getLegs() {
return legs;
}
//提供关于属性age的get和set方法
public int getAge() {
return age;
}
public void setAge(int a) {
age = a;
}
public void eat() {
System.out.println("动物进食");
}
public void show() {
System.out.println("name = " + name + ", age = " + age + ", legs = " + legs);
}
}
输出:
3
name = 大黄, age = 3, legs = 6
name = 大黄, age = 3, legs = 0
大黄