//设置public
public int num1;
//设置private并提供set/get方法
private int num2;
public void setNum2(int num2){
this.num2=num2;
}
public int getNum2(){
return num2;
}
如果仅仅是上面的例子,那么这两种方式是没什么区别的。外部调用的结果都可以对属性进行读取与修改。
这个例子只是展示了一个常规的私有属性与 get/set 方法的使用模式,仅仅从这个例子中看不出来这个模式有什么好处。实际上,公共属性与私有属性的使用,还是有很大区别的:
- 如果一个属性是 public,那么外部可以直接对这个属性进行读取与修改;
- 如果一个属性是 private,那么外部不可以直接对这个属性进行读取与修改,而是通过这个类提供的 get、set 方法去访问。
也就是说,前者把控制权交给别人,而后者的控制权还在自己手中。我举几个简单的例子:
- 比如说一个只读属性,可以提供 get 方法给外界调用读取,但是不允许修改,那么这时候可以不提供 set 方法,或者在 set 方法中抛出异常;
- 比如我的数据格式与别人使用的格式不同,那么我可以在 get 与 set 方法中,加上进行格式转换的代码;
- 比如我的数据可以被读取与修改,但是修改时候必须经过我的验证,那么我的 set 方法中会添加数据验证的代码。
private 目的是私有, 是不让别人用, get/set方法目的是让别人用. 这岂不矛盾了??
是这样的.private 是不让别人用, public 是让别人用, 但是有一种需求是让有的人用而让另外一些人不能用. 这时private/public的功能就出现短板了. 这时就有了set/get方法的用武之地了. 我们可以在set/get方法是设置, 如下:? public set(XXX){? ???????? if(你是A){? ???????????? 你可以设置. ???????? }
???????? else{? ???????????? 对不起, 你没有设置的权限.? ???????? }? }?
例如:一个变量名称为num,我们希望所有对象的num都不是"123",这样我们就可以在setNum()方法中添加限制条件。
private int num;
public void setNum(int x){
//设置限制条件
if(x==123)
System.out.println("num不可取123!")//报错,num属性修改失败
else
this.name=x;//修改成功
}
|