高琦
摘要:Java中的访问控制修饰符实现了对类的封装,其中较复杂的情况笔者一直没有系统、全面的研究。该文结合笔者在Java语言教学中的经验,针对Java语言中访问控制修饰符protected的使用规则进行分析,希望读者读完后能有所收获。
关键词:Java程序设计;访问控制;权限;protected
中圖分类号:TP3 文献标识码:A 文章编号:1009-3044(2017)30-0103-01
Java语言是一门面向对象的程序设计语言,既集中了C++语言的优点,又将C++中难以理解的多继承、指针等概念摒弃,这就决定了Java语言强大的功能性和简单易用的实用性。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程[1]。
面向对象技术的基本特征是封装性,这样可以限制类的外部成员对类的内部成员进行访问,只有通过公共接口才能访问类的成员数据,即把类创建成一个“黑盒子”,虽然可以使用这个类,但是类内部机制是不公开的,也不能随意被修改。在Java语言中的封装是通过访问控制实现的,而访问控制的实现是通过4个访问修饰符实现的:public(公共)、protected(保护)、缺省(包权限)、private。
在Java语言中,类和类成员有不同的访问控制权限,针对类成员,可以用上述四种控制权限修饰类的成员变量和方法,这四个访问修饰符对应类成员的可见度如表1:
由表中的数据可以看出,Java语言中如果要跨包访问类成员,只有protected和public这两个权限修饰符修饰的类成员能够实现,其中,表中对protected修饰符的权限定义是可以被同一类、同一包以及不同包中子类的对象访问,笔者通过查阅大量资料,发现所有对protected修饰符跨包访问权限的说明都是针对不同包中的子类,这样可以理解成在跨包访问该类时,只要是其子类,都可以访问该类中protected权限的类成员,但是经过大量的测试实验证明,并非所有跨包子类都可以访问其父类的protected成员:
在Java工程中创建两个包:cn.btmc.jc和cn.btmc.jc1,在cn.btmc.jc中创建公有类Person(代码如图2所示),将其导入cn.btmc.jc1包中;在cn.btmc.jc1包中创建Person类的缺省子类Student以及公有子类Tes1(代码如图3所示),在Tes1的主方法中分别实例化Tes1与Student的对象t、s,按照表中数据的显示,用对象t与s分别访问其父类Person中的protected权限成员变量name时,都是被允许的,但是在图3中可以看到,缺省子类Student的对象s访问其父类protected权限成员变量name时被拒绝,只有公有子类Tes1的对象t被允许访问。
由此,可以看出,Java语言中,当子类跨包访问其父类protected权限的成员时,只有公有子类的对象被允许访问,非公有子类并没有访问权。
在笔者所查阅的资料中,针对Java语言中protected修饰权限的不同包的访问控制均写为:不同包的子类,通过以上的测试,笔者认为这一权限写为:不同包中的公有子类更为贴切。
参考文献:
[1] 李刚.疯狂Java讲义[M].2版.北京: 电子工业出版社, 2014.endprint