高琦
摘要:Java中的訪問控制修飾符實(shí)現(xiàn)了對(duì)類的封裝,其中較復(fù)雜的情況筆者一直沒有系統(tǒng)、全面的研究。該文結(jié)合筆者在Java語言教學(xué)中的經(jīng)驗(yàn),針對(duì)Java語言中訪問控制修飾符protected的使用規(guī)則進(jìn)行分析,希望讀者讀完后能有所收獲。
關(guān)鍵詞:Java程序設(shè)計(jì);訪問控制;權(quán)限;protected
中圖分類號(hào):TP3 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2017)30-0103-01
Java語言是一門面向?qū)ο蟮某绦蛟O(shè)計(jì)語言,既集中了C++語言的優(yōu)點(diǎn),又將C++中難以理解的多繼承、指針等概念摒棄,這就決定了Java語言強(qiáng)大的功能性和簡單易用的實(shí)用性。Java語言作為靜態(tài)面向?qū)ο缶幊陶Z言的代表,極好地實(shí)現(xiàn)了面向?qū)ο罄碚摚试S程序員以優(yōu)雅的思維方式進(jìn)行復(fù)雜的編程[1]。
面向?qū)ο蠹夹g(shù)的基本特征是封裝性,這樣可以限制類的外部成員對(duì)類的內(nèi)部成員進(jìn)行訪問,只有通過公共接口才能訪問類的成員數(shù)據(jù),即把類創(chuàng)建成一個(gè)“黑盒子”,雖然可以使用這個(gè)類,但是類內(nèi)部機(jī)制是不公開的,也不能隨意被修改。在Java語言中的封裝是通過訪問控制實(shí)現(xiàn)的,而訪問控制的實(shí)現(xiàn)是通過4個(gè)訪問修飾符實(shí)現(xiàn)的:public(公共)、protected(保護(hù))、缺?。ò鼨?quán)限)、private。
在Java語言中,類和類成員有不同的訪問控制權(quán)限,針對(duì)類成員,可以用上述四種控制權(quán)限修飾類的成員變量和方法,這四個(gè)訪問修飾符對(duì)應(yīng)類成員的可見度如表1:
由表中的數(shù)據(jù)可以看出,Java語言中如果要跨包訪問類成員,只有protected和public這兩個(gè)權(quán)限修飾符修飾的類成員能夠?qū)崿F(xiàn),其中,表中對(duì)protected修飾符的權(quán)限定義是可以被同一類、同一包以及不同包中子類的對(duì)象訪問,筆者通過查閱大量資料,發(fā)現(xiàn)所有對(duì)protected修飾符跨包訪問權(quán)限的說明都是針對(duì)不同包中的子類,這樣可以理解成在跨包訪問該類時(shí),只要是其子類,都可以訪問該類中protected權(quán)限的類成員,但是經(jīng)過大量的測(cè)試實(shí)驗(yàn)證明,并非所有跨包子類都可以訪問其父類的protected成員:
在Java工程中創(chuàng)建兩個(gè)包:cn.btmc.jc和cn.btmc.jc1,在cn.btmc.jc中創(chuàng)建公有類Person(代碼如圖2所示),將其導(dǎo)入cn.btmc.jc1包中;在cn.btmc.jc1包中創(chuàng)建Person類的缺省子類Student以及公有子類Tes1(代碼如圖3所示),在Tes1的主方法中分別實(shí)例化Tes1與Student的對(duì)象t、s,按照表中數(shù)據(jù)的顯示,用對(duì)象t與s分別訪問其父類Person中的protected權(quán)限成員變量name時(shí),都是被允許的,但是在圖3中可以看到,缺省子類Student的對(duì)象s訪問其父類protected權(quán)限成員變量name時(shí)被拒絕,只有公有子類Tes1的對(duì)象t被允許訪問。
由此,可以看出,Java語言中,當(dāng)子類跨包訪問其父類protected權(quán)限的成員時(shí),只有公有子類的對(duì)象被允許訪問,非公有子類并沒有訪問權(quán)。
在筆者所查閱的資料中,針對(duì)Java語言中protected修飾權(quán)限的不同包的訪問控制均寫為:不同包的子類,通過以上的測(cè)試,筆者認(rèn)為這一權(quán)限寫為:不同包中的公有子類更為貼切。
參考文獻(xiàn):
[1] 李剛.瘋狂Java講義[M].2版.北京: 電子工業(yè)出版社, 2014.endprint