2.封装

2.封装

有了Rectangle类,对象rectangle就是一个整体。但是,在代码15.1中,rectangle对象的组成部分对外界是可见的,可以直接对rectangle的某一部分(如width或height)进行赋值,见第20行和第21行。而所谓整体,是指对象内部的细节是隐藏起来的、对外界是透明的,对象是作为完整个体进行操作的。这样,才是真正的“面向对象”。那么怎样把对象的细节隐藏起来,并把对象当作整体来操作呢?这就需要封装。

(1)类封装的实现方法

【代码15.2】写一个符合一般封装原则的Rectangle类

在类定义的时候,用访问控制权限修饰符来限定类成员的可访问范围。在需要隐藏起来的成员前加入private,在可以公开访问的成员前加入public。一般在没有特殊设计意图的情况下,类的成员变量前面加private,类的成员方法前面加public。

Rectangle类中的私有成员只在当前类中可以访问,而在TestRectangle类中就不能直接访问Rectangle类中的width和height,即在TestRectangle类中,若有rectangle.width和rectangle.height就会出现语法错误。在TestRectangle类中,只能将对象rectangle作为一个整体,用Rectangle类中公开的成员方法去操作rectangle对象,如用rectangle.get Area()来获得对象的面积,用rectangle.getPerimeter()来获得对象的周长等。这样Rectangle类就实现了基本的“封装”。

在Test Rectangle类中不能访问Rectangle类中的私有成员width和height,如果在Test Rectangle类中需要得到对象rectangle的width或者height或者需要修改对象rectangle的width或者height,如何实现呢?在设计Rectangle类的时候,如果允许类的引用者可以获取或者修改成员变量的值,需提供相应的成员方法。类的引用者通过调用类中可访问的成员方法来访问类中的成员变量。在代码15.2的第5行到第16行中Rectangle类提供了成员方法,get Width()和get Height()提供给引用者用来获得矩形对象的width和height,set Width(double)和set Height(double)提供给引用者用来修改矩形对象的width和height,这类方法统称为setter()/getter()方法。是否提供这些方法,需要类的设计者根据项目的具体需求来判断是否允许类的引用者获得、修改成员变量的值,如果允许,就提供;如果不允许,就不提供。哪些允许,就提供哪些。例如,如果不允许对所有的矩形对象的height做修改,那么就不提供set Height(double)方法。

(2)this的用法

在类定义的内部,this指代当前类的对象。例如,

此setter()方法的功能是将参数width的值赋值给当前对象的width成员变量。因为无论是参数还是成员变量都指的是矩形的宽度,所以都命名为width,但是二者又是不同的,不能写成如下形式:

赋值号左边的width指的是当前对象的成员变量,就用this.width,this指代的是当前对象。赋值号右边的width指的是参数。那么“当前对象”到底实际上指的是谁呢?

如下程序表示在Test Rectangle类中创建对象rectangle,然后给rectangle对象的width属性赋值2.5,这里的2.5就是实参,“当前对象”就是rectangle对象。由此,调用set Width()方法的对象就是所谓的“当前对象”。

(3)访问控制修饰符

在类定义的时候,类的成员变量和成员方法前面用访问控制修饰符来设定此成员的可访问范围。

类成员的访问控制修饰符一共有4种,即private、protected、public和默认方式(不写访问控制修饰符),如表3.15.1所示。

表3.15.1 类的访问控制修饰符

在一般情况下的类设计中,类的成员变量用private,类的成员方法用public。当然,在实际应用中,对于各种不同的设计需要,可以有各种不同的定义方式。

构造方法