一、封装性的引入
1、高内聚,低耦合
高内聚:类的内部数据操作细节自己完成,不允许外部干涉;
低耦合:仅对外暴露少量的方法用于使用。
2、封装性的设计思想
隐藏对象内部的复杂性,只对外公开简单的接口。便于外界调用,从而提高系统的可扩展性、可维护性。通俗的说, 把该隐藏的隐藏起来,该暴露的暴露出来。 这就是封装性的设计思想。
封装可以被认为是一个保护屏障,防止该类的代码和数据被其他类随意访问。要访问该类的数据,必须通过指定的方式。适当的封装可以让代码更容易理解与维护,也加强了代码的安全性。
3、问题的引入
当我们创建一个类的对象以后,我们可以通过"对象.属性"的方式,对对象的属性进行赋值。这里,赋值操作要受到属性的数据类型和存储范围的制约。除此之外,没有其他制约条件。但是,在实际问题中,我们往往需要给属性赋值加入额外的限制条件。这个条件就不能在属性声明时体现,我们只能通过方法进行限制条件的添加。(比如:年龄属性不能为负数等问题)
同时,我们需要避免用户再使用"对象.属性"的方式对属性进行赋值。则需要将属性声明为私有的(private)。
至此,针对于属性就体现了封装性。
二、封装性的体现(Encapsulation)
1、信息的封装和隐藏
Java 中通过数据声明为私有的(private),再提供公共的(public)方法:getXxx()和 setXxx() 实现对该属性的操作,以实现下述目的:
(1)隐藏一个类中不需要对外提供的实现细节;
(2)使用者只能通过事先定制好的方法来访问数据,可以方便地加入控制逻辑,限制对属性的不合理操作;
(3)便于修改,增强代码的可维护性;
2、Demo
1 public class Zoo { 2 public static void main(String[] args) { 3 Animal animal = new Animal(); 4 animal.setLegs(4); // animal.setLegs(-100); 5 //animal.legs = -100; //非法的,The field Animal.legs is not visible 6 System.out.println(animal.getLegs()); 7 } 8 } 9 10 class Animal { 11 private int legs; //将属性legs定义为private,只能被Animal类内部访问 12 public void setLegs(int i) { 13 if (i != 0 && i != 2 && i != 4) { 14 System.out.println("Wrong number of legs"); 15 return; 16 } 17 legs = i; 18 } 19 20 public int getLegs() { 21 return legs; 22 } 23 }
注意:
对于 Getter 来说,不能有参数,返回值类型和成员变量对应。
对于 Setter 来说,不能有返回值,参数类型和成员变量对应。
3、封装性的体现
对封装性的体现不仅表现在上面的私有的 成员变量,还包括不对外暴露的私有的方法,私有的构造方法等。
三、四种访问权限修饰符
1、四种访问权限修饰符
Java权限修饰符public、 protected、 (缺省)、 private置于类的成员定义前,用来限定对象对该类成员的访问权限。
对于 class 的权限修饰符只可以用 public 和 default (缺省)。
public 类可以在任意地方被访问。
default 类只可以被同一个包内部的类访问。
2、封装性的体现,需要权限修饰符来配合
(1)Java 规定的4中权限(从小到大排列):private、缺省、protected 、public
(2)4种权限可以用来修饰类及类的内部结构:属性、方法、构造器、内部类;
(3)具体的,4种权限都可以用来修饰类的内部结构:属性、方法、构造器、内部类;
(4)修饰类的话,只能使用:缺省、public;
总结封装性:Java提供了4种权限修饰符来修饰类及类的内部结构,体现类及类的内部结构在被调用时的可见性的大小。