数据域封装
在上一篇博文中(对象和类(四))中从代码中可以知道,类的数据域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的语句了,不可以在客户端内部访问私有数据了。