访问级别
访问级别修饰符确定其他类是否可以使用特定字段或调用特定方法。有两个级别的访问控制:
1.在顶级
- public或package-private(没有显式修饰符即默认权限)。
类可以用修饰符public声明,在这种情况下,类对所有类都可见。如果一个类没有修饰符(默认,也称为package-private),它只在自己的包中可见。
2.在成员级别
- public,private,protected或package-private(没有显式修饰符即默认权限)。
在成员级别,也可以使用public修饰符或无修饰符(package-private),如同顶级类一样,具有相同的含义。
对于成员,除public和默认外有两个附加的访问修饰符:private和protected:
private修饰符指定该成员只能在其自己的类中访问。
protected修饰符指定该成员只能在其自己的包(如package-private)中访问,此外还可以由另一个包中的该类的子类访问。
下表显示了对每个修饰符允许的成员的访问权限。
第一列指示类本身是否有权访问由访问级别定义的成员。正如你可以看到,一个类总是有权访问它自己的成员。
第二列指示与该类(不管其父级)相同的包中的类是否具有对成员的访问权限。
第三列指示在此包外部声明的该类的子类是否有权访问成员。
第四列指示是否所有类都具有对成员的访问权限。
访问级别通过两种方式影响您
第一,当您使用来自另一个源(例如Java平台中的类)的类时,访问级别将确定您自己的类可以使用的那些类的哪些成员
第二,当你写一个类时,你需要决定每个成员变量和类中的每个方法应该具有什么访问级别。
让我们看一下类的集合,看看访问级别如何影响可见性。下图显示了此示例中的四个类以及它们之间的关系。
此例中:
One包有Alpha和Beta两个类,Two包中有AlphaSub和Gamma类,其中AlphaSub继承Alpha
下表显示了Alpha类的成员(成员变量、成员函数)对于可应用于它们的每个访问修饰符的可见性。
Alpha类内所有成员都可以访问
Beta与Alpha在同一包中,因而Alpha的私有成员Beta不能访问
Alphasub与Alpha不在同一包中,但AlphaSub是Alpha的子类,因而AlphaSub不能访问Alpha的默认和私有成员
Gamma与Alpha位于不同包且无继承关系,因而Gamma只能访问Alpha的public成员
选择访问级别的提示:
如果其他程序员使用你的类,你想要确保不会发生滥用错误。访问级别可以帮助您这样做。
1.使用对特定成员有意义的最严格的访问级别。使用私有时,除非你有一个很好的理由不使用。
2.避免使用公共字段(常量除外)。