8.8 访问控制
有时候类的设计者希望把类设计成一个黑盒:类的使用者只能够使用开放的接口(方法),对于类的内部,有多少个属性,是什么,还有多少辅助的方法,类的使用者不必知道也无需知道。为了这个目的,就有了类的访问控制。访问控制实际上是为了控制对象中的属性和方法,对象是否可以访问,这跟对象所处的位置有关系。
访问控制符是修饰属性和方法的,一共有以下四种:
1.private
私有的,这个关键字,代表对象的属性和方法是私有的、禁止访问的。在类的外部,无法读取、修改这个类的对象的私有属性,无法调用对象的私有方法。只有在这个类内部,才能使用这个些属性和方法。这部分就相当于黑盒。例如有这样一个Student类,它的三个属性都是private私有的,然后printName是公开的。
public class Student{
private String name;
private String id;
private String clazz;
public void printName(){
System.out.println("名字是:"+name);
}
}
这个main函数只有在Student类里面才是合法的,当别的类有这样的代码的时候,在stu.name="上官二狗"处就会报语法错误,提示name不可见:
public static void main(String[]args){
Student stu=new Student();
stu.name="上官二狗";
stu.printName();
}
stu.printName();是合法操作。这个时候,printName()这种公开的就是设计者提供给别人使用的接口。如果和电视机做个比方,name、id、clazz类似于电视机的内部电路,我们用电视的时候从来不会去关心它们,也不能改变它们的值,而printName就是遥控器上面的按钮,我们是可以使用的。
2.public
公开的,这个关键字,代表公开的。使用者可以直接访问、修改public属性,如果方法有这个关键字,代表使用者可以直接调用。例如下面的类Student:
public class Student{
public String name;
public String id;
public String clazz;
public void printName(){
System.out.println("名字是:"+name);
}
}
假如下面这段代码的main函数在任何包里,都不会有语法错误,因为name和printName方法都是公开的:
public static void main(String[]args){
Student stu=new Student();
stu.name="上官二狗";
stu.printName();
}
一般来说,非静态(不含static)属性是不会设置成public的,按照类的封装原则,都要设置成private,public是对外的接口
3.缺省,也就是什么也不写
如果属性或者方法前没有任何修饰符,代表属性和方法在同一个包里面的公开的。只要是同一个包的类,可以直接访问、修改属性,如果方法有这个关键字,代表使用者可以直接调用。例如类Student:
public class Student{
String name;
String id;
String clazz;
}
这里面的name、id和clazz前面就是什么都没写的。
假如下面这段代码的main函数所在的类只要和Student类在同一个包里面,都不会出语法错误,否则就会有“属性不可见”的语法错误。
public static void main(String[]args){
Student stu=new Student();
stu.name="上官二狗";
}
4.protected
用在子类,简单说对于继承类是public的,对于其他类就是private的,这个属性我们在类的继承有更详细的讨论。