首页 理论教育 类中成员的访问权限

类中成员的访问权限

时间:2022-02-28 理论教育 版权反馈
【摘要】:Java将类中成员的访问权限(可见性)划分为4种情况,按照访问权限的范围大小从小到大列出如下。类Circle中的成员变量radius和成员方法getArea()被protected修饰,而访问该变量、方法的代码位置是在与Circle类不同包的子类Ball中。类中声明为public的成员,所有包内中的代码都可访问它。类中成员的访问权限也与类的访问权限有关。类成员的访问级别共有4种,按照受限制程度从强至弱依次是:私有、默认、保护和公共。

4.7.2 类中成员的访问权限

Java将类中成员(成员变量和成员方法)的访问权限(可见性)划分为4种情况,按照访问权限的范围大小从小到大列出如下。

·私有(private)成员:仅在本类内中的代码可访问它。

·默认(无修饰符)成员:在同一包内中的代码可访问它。

·保护(protected)成员:在同一包内及其子类(不同包)中的代码可访问它。

·公共(public)成员:在所有包内中的代码可访问它。

1.私有(private)成员

类中修饰为private的实例变量和实例方法,只能被这个类本身的方法访问,在类外不能通过变量名或方法名访问它。

类中的实例变量一般修饰为private,并通过public修饰的set方法和get方法设定或读取private实例变量的值。

类中的一些辅助方法,因为不属于该类向外界提供的服务,因此修饰为private。

【例4-25】 类Circle中私有成员的访问。

img238

如果一个类的构造方法修饰为private,表明其他类不能通过这个构造方法生成该类的实例。如果想生成该类的实例,可定义一个静态方法,在该静态方法中,创造该类对象(即引用这个私有构造方法),并返回对象的引用值。这样,就能通过引用这个静态方法间接地生成一个实例。

【例4-26】 类Circle中私有构造方法的访问。

img239

2.默认(无修饰符)成员

例4-4和例4-23的类Circle中的实例变量radius和实例方法getArea()、getPerimeter()前都没有修饰符,而类Circle和类Ex4_4在一个包中。因此,在类Ex4_4中可以引用实例变量radius和实例方法getArea()、getPerimeter()。

3.保护(protected)成员

类中修饰为protected的成员可以被这个类本身、同一个包中的其他的类以及其他包中的子类访问。

如果一个类有子类,而不管子类是否与自己在同一个包中,都想让子类能够访问自己的某些成员,就应该将这些成员修饰为protected。

【例4-27】 类Circle中保护成员的访问。

img240

img241

程序运行结果:

img242

分析与思考:(1)类Circle在xiyou.chapter04包中,类Ball和类Ex4_27在xiyou包中,且类Ball是类Circle的子类。类Circle中的getPerimeter()方法没有修饰符,而访问该方法的代码在类Ball中。由于类Circle和类Ball不在同一个包中,没有修饰符的getPerimeter()方法不能被访问。

(2)类Circle中的成员变量radius和成员方法getArea()被protected修饰,而访问该变量、方法的代码位置是在与Circle类不同包的子类Ball中。访问代码obj是Circle类型,不是当前子类Ball,因此无法访问。而访问代码object是Ball类型,是当前子类Ball,因此可以访问。

(3)总之,当从其他包的子类访问protected成员时,访问该成员的引用类型必须是当前子类,或者是当前子类的子类。

4.公共(public)成员

类中声明为public的成员,所有包内中的代码都可访问它。例4-24的Circle类在xiyou.zxl.javabook.chapter04包中,内容是:

img243

由于类Circle中的成员radius、getArea()和getPerimeter()都被修饰为public,因此,任何包中的类都能引用它们。如果将它们修饰为非public,由于xiyou.zxl.javabook包中类Ex4 _4与xiyou.zxl.javabook.chapter04包中类Circle中不在同一个包中,类Ex4_4不是类Circle的子类,因此,类Ex4_4无法引用它们。

注意:要引用一个类的成员,首先要能够引用该类,然后才有可能引用其成员。类中成员的访问权限也与类的访问权限有关。例如,类Circle中成员的访问权限为public,而类Circle的访问权限为没有被public修饰,则类Circle只能在本包内被引用,因此,类Circle中的成员也只能在本包内被访问。

小结 编译系统主要从两方面来判断访问的合法性:一是被访问实体的访问级别,即被何种访问修饰符修饰(或者没有用修饰符修饰);二是访问代码出现的位置,即访问位置。例如,类的访问级别有两种,即用public修饰和没用public修饰;访问位置也可分两种情况,即被访问类所在的包和其他包,即访问的代码与被访问的类在同一个包或不在同一个包。用public修饰的类既可以在类所在的包中被访问,也可以在其他包中被访问;没有用public修饰的类只能在该类所在的包内被访问。

类成员的访问级别共有4种,按照受限制程度从强至弱依次是:私有(private)、默认(无修饰符)、保护(protected)和公共(public)。访问类成员的代码位置同样有4种情况:被访问成员所在类、被访问成员所在包中的类、被访问成员所在类在其他包中的子类、被访问成员所在类在其他包中的非子类,如表4-1所示。

表4-1 类成员的访问级别

img244

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈