十、Java从头开始-把数据隐藏起来:封装

把数据隐藏起来:封装

 

 

在之前设计的程序中,我都犯了一个很糟糕的错误,这种错误不是简单的程序漏洞,它所带来的后果可能是致命的。那么到底我错在哪里?泄露数据!!我并没有注意到我之前设计的程序中数据会被所有人看到,甚至是可以随意改动,按照以前的设计模式,很多重要的实例变量都完全暴露在外,意思就是可以通过圆点运算符来直接存取数值,比如下面这个模仿在ATM上的操作:

public class ATM {
	public double customerMoney;		//客户的账户余额
}

 

 

测试类: 
public class TestATM {
public static void main(String[] args) {		
		ATM myAtm = new ATM();	        //创建一个Atm的实例对象myAtm
		myAtm.customerMoney = 500; 	//给客户账户余额存值 
	}
}

 

上面的程序设计容许在没有任何限制条件下直接控制修改ATM的实例变量,若这种权限落入不当之人的手上,后果可能就会出现如下面的操作:

myAtm.customerMoney = -500; 		//银行卡上出现负资产
myAtm.customerMoney = 1000000; 	//或者办自己变为百万富翁

 这样的结果会变得非常糟糕。所以我绝不能把我的实例变量暴露给其他人,我需要在声明我的实例变量时把它变为私有的(private,然后给每个实例变量设计一个settergetter方法,强制其它程序必须通过这两个方法来存取变量而不是直接的操作。现在来给上面的程序添加setter方法和getter方法:

 

 

 

私有的(private):表示一个类的私有属性,只能在本类中访问到,在其他的类中无法进行访问。

 

public class ATM {
	private double customerMoney;		//客户的账户余额

         public double getCustomerMoney() {
		return customerMoney;
	}
	public void setCustomerMoney(double money) {
	//在这里我就可以对传入的customerMoney参数值进行任何你想要的设置条件
             if( customerMoney > 0 && 判断当前操作者有修改权限 && . . . ){
	     customerMoney = money;
	   System.out.println("你的账户余额还有:"+ customerMoney);
            }else{
	       System.out.println("非法数值、没有权限 ... ");
           }
	}
}

 customerMoney设置为private后外部只能通过上面的settergetter来存取它的值:

public class TestATM {
       public static void main(String[] args) {		
	      ATM myAtm = new ATM();				//创建一个Atm的实例对象myAtm
	      myAtm.setCustomerMoney(500);		//给客户账户余额存值
                myAtm.setCustomerMoney(-1000);	//给客户账户余额存值
	}
}
运行结果:	你的账户余额还有:500
		非法数值、没有权限 ..

 

通过上面的例子,可见隐藏数据的重要性再明显不过,以下就是封装的基本原则:将你实例变量标记为私有的,并提供公有的gettersetter来控制存取动作。

你可能感兴趣的:(java)