java语言中有四种不同的限定词,提供了四种不同的访问权限。
1) private
类中限定为private的成员,只能被这个类本身访问。
如果一个类的构造方法声明为private,则其它类不能生成该类的一个实例。
2) default
类中不加任何访问权限限定的成员属于缺省的(default)访问状态,可以被这个类本身和同一个包中的类所访问。
3) protected
类中限定为protected的成员,可以被这个类本身、它的子类(包括同一个包中以及不同包中的子类)和同一个包中的所有其他的类访问。
4) public
类中限定为public的成员,可以被所有的类访问。
表3-1列出了这些限定词的作用范围。
【表3-1】 java中类的限定词的作用范围比较
=============================================================
|| 同一个类 同一个包的类 不同包的子类 不同包非子类 ||
|| private * ||
|| default * * ||
|| protected * * * ||
|| public * * * * ||
=============================================================
说明:上面这个表,看起来很简单,而且也很容易记忆,但是却蕴含着极为丰富的信息,可以从不同的角度来理解上面的这个表。
比如在同一个类里面时,四个关键词都相当于是public,可以不在乎限定词是什么;在同一个包里面时,除了private限定词外,所有的限定词的作用都完全等同于public。我们经常会思考这样一个问题:一个类的属性和方法是否对外可见?这个问题描述中提到的“可见”二字,当环境为“非子类”时,说白了就是我们能否通过实例化这个类后,用一个对象把这个类的这些字段或者方法给“点”出来,即“某对象.某属性(或某方法)”。因为通常我们都是在不同包的环境下操作的,比如我们会import很多系统的包中的类,诸如“import java.awt.*;”这样的语句,因此我们使用这些包中的类时,它们对我们的可见也就仅仅局限在使用“public”限定词修饰的属性或方法上了,因此大家往往会误以为只有public的东西才能点出来,实则不然,当我们在同一个包中的非子类中也可以把除了private修饰的东西之外的所有属性和方法给“点”出来。其实对于“点”这个运算,可以分两个角度去理解,既然能用到“点”操作,那就代表了我们使用的环境应该是“非子类”,非子类又可以分为“包内”和“非包内”,对于“包内”,只要不是private修饰的东西都能点出来;对于“非包内”则只能是public的东西才能点出来;;;如果是在“子类”中操作时,大家可以思考一下,我们还用“点”操作吗?显然不用了,因为在子类中,父类中定义的东西只要可见的话都可以被你拿过来用,因此根本就用不到点操作,当然这里也要分“包内”和“非包内”。对于default限定词,我们不能显示的使用它来定义属性或方法,只要我们在定义属性或方法的前面什么限定词都不加,就默认的使用了default限定词。