封装性
我要用洗衣机,只需按开关即可,无需了解洗衣机的内部结构。
以上这句话可能大家在搜索学习封装性的时候可能都听过,可是这句话严重误导了我。可能是由于面向过程的学习太过深刻,我联想到了函数,函数不就是把洗衣服的过程全部“封装”起来了吗?我只需要调用函数方法就可以了呀,确实无需了解函数内部是怎么写的。那这是“封装”吗?答案:不全面
通俗地讲,封装就是把该隐藏的隐藏起来,该暴露的暴露出来。
所谓封装,就是把客观事物封装成抽象概念的类,并且类可以把自己的数据和方法只向可信的类或者对象开放,向没必要开放的类或对象隐藏。外界无法直接进行修改等操作,只能通过给定的当时进行访问和修改。
为了实现隐藏或暴露的不同权限,就要用到权限修饰符:
修饰符 | 本类内部 | 本包内 | 其他包的子类 | 其他包非子类 |
---|---|---|---|---|
private | √ | |||
缺省 | √ | √ | ||
protected | √ | √ | √ | |
public | √ | √ | √ | √ |
注意:外部类只能用public、缺省修饰;其它则上述四种均可。
封装性的经典体现:
- 私有化(private)类的属性,外界无法直接进行修改等操作,只提供给定的公共的(public)set\get方法进行访问和修改。
//学生类
public class Student {
private String name;
public Student(String n){
this.name=n;
}
public String getName(){
return this.name;
}
public void setName(String n){
this.name=n;
}
}
//测试运行类
public class Main {
public static void main(String[] args) {
Student s1=new Student("小杰");
System.out.println(s1.getName());
s1.setName("小红");
System.out.println(s1.getName());
}
}
这就是封装性的一个经典使用案例,外界只能通过给定的set\get方法访问和修改name这个属性,而不能通过对象直接调用属性,如s1.name就是错误的,因为name属性是私有的。
那很多人就会想着说,这到底有什么用呢?name属性不也一样是被修改了吗?其实我也有这个疑问,就上面这个例子来说,其实可以在set方法中添加一些合法性检验,比如:
public void setName(String n){
if(n.length()<2){
System.out.println("Error,不合法");
return;
}
在网上找的课程上说,这是”提高系统的安全性,隐藏代码的实现细节“。有没有人能结合具体的案例说一下这么封装的作用到底是什么呢😢😢😢😢😢😢
- 类中不需要对外暴露的方法,即仅供类内使用的方法,将其设置为private。
封装性也体现了我们程序设计对于“高内聚,低耦合”的追求。在封装性中,高内聚就是类内部数据的操作细节自己完成,不允许外部干涉,低耦合就是仅暴露少量的方法给外部使用。