8.9 访问控制的应用
上一节讲述的访问控制,到底有什么用处呢?
1.黑盒
所谓黑盒,就是对外不可见。例如手机内部电路对于使用者,就是黑盒,它里面到底是怎么运作的,使用者无需关心。
我们经常使用的String类,实际上它的内部,是一个字符数组,也就是char[],如下图所示的value:
String的设计者决不希望你直接去操作这个value数组,例如取得第一个元素value[0]这样,于是这个属性就是private,任何一个String对象,都无法修改value。
能够达到这个效果的有private和protected(子类可见,其他不可见)。
一般来说,类所有非静态属性都应该是private的(私有的)。
但是全部做成黑盒,是无法使用的,就好像一台没有按键的机器,而这些按键就是对外公开的接口。这就是public的功能了。
2.对外接口
对外的接口,例如电视遥控器,手机屏幕。表现为代码就是公开的方法(public修饰的方法),这些方法可以读取或者修改private属性。它们就是设计者提供的方法,就是设计者提供的使用规范。
例如String有一个方法是截取字符串片段,subString,使用者只要提供参数给它就可以了,至于它内部怎么操作的,使用者不必关心。
类的设计,其实就是创造一个黑盒,然后再提供各种对外接口的过程。
3.getter和setter
上面讲到设计类的时候,所有属性都应该是私有的,假如有些属性,又允许使用者修改呢?仍然不提倡把属性的private改成public,而是提供两个方法,一个读取这个属性,一个修改这个属性。这种专门为了读取和修改属性而存在的方法,叫做getter和setter,它们的名字通常也有规定,就是get+属性名以及set+属性名,如下所示:
public class Student{
private String name;
//...别的属性,省略
//读取name属性;
public String getName(){
return name;
}
//修改name属性
public void setName(String newName){
name=newName;
}
}
使用Student对象的时候,就是这样来设置和读取name属性:
Student stu=new Student();
stu.setName("丁一");
System.out.println(stu.getName());
4.private方法
方法也可以设置成private的,假如一些方法仅仅在内部供其他方法使用,又不希望类的外部去使用它,那么就设计成private。看下面的例子:
public class ClassA{
private void A(){
/*
省略
*/
System.out.pirntln("A被调用");
}
private void B(){
/*
省略
*/
System.out.pirntln("B被调用");
}
public void C(){
System.out.pirntln("C被调用");
A();
B();
}
public void D(){
System.out.pirntln("D被调用");
/*
做些别的事情
*/
A();
}
}
这里A和B都是私有的,C和D是公开的,因为有部分代码重复,C和D都用得上,于是把这部分代码提取成A函数,这样可以减少重复代码。而提取出来的A函数,对外是没有意义的,那么就设置成private。
使用的时候,就是这样:
ClassA t=new ClassA();
t.C();
t.D();
//报错,A函数不可见
t.A();