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