巧记Java访问控制描述符(Access Control Modifier)public, private, protected
本文转自 http://blog.csdn.net/wangpingfang/article/details/4206340
在我们开始这个话题之前,不妨请大家看一道大公司经常考察的笔试题,顺便也测试一下你自己对Java访问控制的理解是否到位。
看完代码之后,你是否有这样一种想法:“我平时怎么没有写过这样的代码,这段代码看起来很怪,是不是存在错误”,如果你真的存在类似这样的想法,那么我可以明确地告诉你:你对Java访问控制描述符的理解还不够深刻。不过这没有关系,因为你看完这篇文章之后,你就可以和这种状况说再见了。现在就让我们开始愉快的学习之旅吧。
访问级别描述符定义了其他类能否使用某个特定的成员变量或调用某个特定的成员方法。Java中有两种级别的访问控制描述符:
- 类级别 :即用来修饰类的访问控制描述符。该级别有public(公有)和package-private(包私有,没有显式使用描述符)
-
成员级别 :即用来修饰成员的访问控制描述符。该级别有public(公有)、private(私有)、protected(受保护)和package-private(包私有,没有显式使用描述符)
类级别描述符
如果使用public 描述符声明一个类,那么所有的类都可以使用这个类,包括与该类同一个包和不同包的。如果一个类前面没有访问控制描述符,那么这个类就是package-private 的,其实这个词非常好理解,就是说只有和这个类在同一个包的其他类才能使用该类,其他包的类都不能使用该类。
(作者 注:所谓的使用包括继承、作为成员、作为变量等等,在这告诉大家一个比较好的记忆方法:只要在类前面的improt中引用了该类,都可以认为是使用了该类 )
成员级别描述符
和类级别一样,在成员级别你也可以使用public 和package-private ,他们的意义与在类级别中是相同的,即声明为public 的成员(成员是成员变量和成员方法的合称),可以在任何地方使用,声明为package-private 的成员则只能在包内被使用。对于成员,还有另外两个访问描述符来控制其访问:private 和protected ,private 表示该成员只能在该类的内部 使用(翻译成英文即是The private modifier specifies that the member can only be accessed in it's own class);protected 表示该成员只能在该类所在的包内部使用,同时还能够被其他包中的子类访问(本包的类别说是子类,非子类都可以访问)(翻译成英文即是The protected modifier specifies that the memeber can only be accessed in it's own package and in addition by a subclass of its class in other package)。
看完这个之后,大家可能还会觉得巧记在何处?那么让我来慢慢解释:
对于public 描述符,你只需要记住一条,你在哪 都可以访问。
private 描述符表示该成员只能在该类的内部 使用,我们需要重点理解的是“在该类的内部 ”,意思是只要是在定义该成员的类的内部(类的内部是一个空间范围 名词,只要是在{}之间的代码都算作是在类的内部),爱怎么用就怎么用,不妨回到上述代码的类Demo1,在方法add中,使用了Demo1类型的参数added,并且通过added.priStr这种方式直接引用该成员变量,可能大家对这条语句是最有意见的,那么我们现在通过这种方式判断:因为我是在定义priStr的类的内部(即Demo1)中使用它,所以是合法的,同理在main方法中也是在Demo1类的内部,因此也可以直接访问priStr成员和add方法。
至于protected 描述符和package-private ,则只要是在该类所在包内部 ,也可以随便使用。我以代码示之(我编写的代码是一个完整的类,包含了package,import声明,在学习访问控制时,package声明一定要注意)。
从上面可以看出,Demo2和Demo1在同一个包内,所以在类Demo2内部,除了Demo1的私有成员不能访问之外,其他成员均可以直接访问。
比package-private 作用范围更强一点,protected 描述符修饰的字段还能够被其他包中它的子类所访问,一定要注意在“类的内部被访问”和“被类使用”的区别,被其他包中它的子类使用,表明该成员只能被子类使用,而不是在该子类中使用,看一段代码就明白了。
从上图可以看出,Demo3是Demo1在其他包中的子类,所以此时只能是Demo3使用该成员,即从父类继承下来的成员,但是Demo1类型的对象已经不能直接访问其protected成员了。