数据域封装
在上一篇博文中(对象和类(四))中从代码中可以知道,类的数据域radius和numberOfObjects可以直接修改。(静态和实例的改动)非常不好,因为:
①数据可能被篡改
②使得类变得难以维护,同时容易出现错误(不仅这个类需要修改,而且使用这个类的程序也许要修改)
综上,应该使用private修饰符将数据域声明为私有的,称之为数据域封装。
get和set方法
此举将私有数据域的类外的对象访问数据域的途径砍断了,但总有程序需要访问,于是才需要提供一个get方法返回数据域的值。为了更新数据域,则需要提供一个set方法来给数据域设置新值。
get被称为:访问器
set被称为:修改器
实例验证:
package test;
public class CircleWithPrivateDataFields {
/** The radius of the circle */
private double radius = 1;
/** The number of the objects created */
private static int numberOfObjects = 0;
/** Construct a circle with radius 1 */
public CircleWithPrivateDataFields() {
numberOfObjects++;
}
/** Construct a circle with a specified radius */
public CircleWithPrivateDataFields(double newRadius) {
radius = newRadius;
numberOfObjects++;
}
/** Return radius */
public double getRadius() {
return radius;
}
/** Set a new radius */
public void setRadius(double newRadius) {
radius = (newRadius >= 0) ? newRadius : 0;
}
/** Return numberOfObjects */
public static int getNumberOfObjects() {
return numberOfObjects;
}
/** Return the area of this circle */
public double getArea() {
return radius * radius * Math.PI;
}
}
package test;
public class TestCircleWithPrivateDataFields {
/** Main method */
public static void main(String[] args) {
// Create a Circle with radius 5.0
CircleWithPrivateDataFields myCircle =
new CircleWithPrivateDataFields(5.0);
System.out.println("The area of the circle of radius "
+ myCircle.getRadius() + " is " + myCircle.getArea());
// Increase myCircle's radius by 10%
myCircle.setRadius(myCircle.getRadius() * 1.1);
System.out.println("The area of the circle of radius "
+ myCircle.getRadius() + " is " + myCircle.getArea());
}
}
结果:
The area of the circle of radius 5.0 is 78.53981633974483
The area of the circle of radius 5.5 is 95.03317777109125
从这段程序也可以看得出,在客户端程序中不能使用类似myCircle.radius的语句了,不可以在客户端内部访问私有数据了。