在JAVA中,一共是4种访问权限修饰符
public protected default(默认修饰符,什么都不用写) private,其权限表如下
全部 | 派生类 | 包内部 | 类内部 | |
public | Y | Y | Y | Y |
protected | N | Y | Y | Y |
default | N | N | Y | Y |
private | N | N | N | Y |
其中,public的权限最大,protected次之,default第三,private最小
对于public修饰的类,方法,字段,均可在任何地方访问
对于protected修饰的,则只可以在其派生类(继承)及相同包的类中进行访问
缺省的修饰符就是表格中的default,也就是在同一个包内可防伪
private表示只有在类的内部才可以使用该类,方法,字段。
eg1(public and default):
package access.dessert中有一个class Cookie
public class Cookie{
void bite(){};
}
package access中有一个class Dinner
那么在Dinner这个类中可以访问class cookie,比如 new Cookie();
但是不可以调用cookie.bite(),因为默认的修饰符是default,是包访问权限,而两个类的包不同,所以无法访问
虽然这两个类均来自与access这一个包中,但是在这里的包访问权限指的是这个类的上一级目录是否相同,而非指根目录
eg2(private):
class Sundae{
<span style="white-space:pre"> </span>private Sundae(){}
<span style="white-space:pre"> </span>static Sundae makeSundae(){
<span style="white-space:pre"> </span>return new Sundae();
<span style="white-space:pre"> </span>}
}
在这个例子中,将类的构造函数设置为private,则无法通过new Sundae()这一操作来实例化对象,如果一定要实例化对象,就必须通过Sundae.makeSundae()来实现,后续的单例模式会介绍这种做法。
eg3(protected)
protected修饰符提供了派生类,包,类的访问权限,其主要作用在于继承时候的字段修饰,例子如下:
还是eg1中的cookie class,如果不进行任何修改,在Dinner中试图访问bite方法时,会出现错误,因为没有访问权限
下面进行相应修改:
class Dinner extens Cookie
然后将cookie中的bite方法的修饰,改为protected,那么在Dinner中就可以正常访问了.
因为当我们继承一个类时,会将其类中的所有属性,所有方法,内部类都拷贝一份到派生类中(即使是private字段也是如此)。但是由于访问权限的原因,我们不一定能使用这些属性和方法。
protected修饰符提供了派生类的访问权限
所以如果继承于父类,那么父类中拥有的修饰符为public,protected的方法,属性是可以直接调用的!