Java中的權(quan)限修(xiu)飾符
時間(jian):2018-12-24 來源:華清遠(yuan)見
java面向(xiang)對象的基本(ben)思想之一是封裝細節并(bing)且公開接(jie)(jie)口。Java語言采用訪(fang)問控(kong)制(zhi)修飾符來控(kong)制(zhi)類(lei)及類(lei)的方法和變量的訪(fang)問權限,從而向(xiang)使用者暴露接(jie)(jie)口,但隱藏(zang)實現(xian)細節。訪(fang)問控(kong)制(zhi)分為(wei)四(si)種級別:
(1)public: 用public修飾(shi)的類(lei)、類(lei)屬變量及方法,包(bao)內及包(bao)外的任何類(lei)(包(bao)括子類(lei)和普(pu)通類(lei))均可以訪問;
(2)protected: 用protected修飾(shi)的類、類屬變(bian)量及方法,包內的任何類及包外(wai)(wai)那些繼承了該(gai)類的子(zi)(zi)類才能訪問(包外(wai)(wai)的子(zi)(zi)類可(ke)以用Super來(lai)訪問),protected重點突(tu)出繼承;
(3)default: 如果一個(ge)類(lei)(lei)(lei)(lei)、類(lei)(lei)(lei)(lei)屬變(bian)(bian)量及方法(fa)(fa)沒有用(yong)任(ren)何修(xiu)飾符(即沒有用(yong)public、protected及private中(zhong)任(ren)何一種修(xiu)飾),則其(qi)訪(fang)(fang)問(wen)權(quan)限(xian)為default(默(mo)認(ren)訪(fang)(fang)問(wen)權(quan)限(xian))。默(mo)認(ren)訪(fang)(fang)問(wen)權(quan)限(xian)的類(lei)(lei)(lei)(lei)、類(lei)(lei)(lei)(lei)屬變(bian)(bian)量及方法(fa)(fa),包(bao)(bao)內的任(ren)何類(lei)(lei)(lei)(lei)(包(bao)(bao)括(kuo)繼承了此類(lei)(lei)(lei)(lei)的子(zi)類(lei)(lei)(lei)(lei))都可(ke)以訪(fang)(fang)問(wen)它(ta),而對于包(bao)(bao)外(wai)的任(ren)何類(lei)(lei)(lei)(lei)都不(bu)能訪(fang)(fang)問(wen)它(ta)(包(bao)(bao)括(kuo)包(bao)(bao)外(wai)繼承了此類(lei)(lei)(lei)(lei)的子(zi)類(lei)(lei)(lei)(lei))。default重點突出(chu)包(bao)(bao);
(4)private: 用private修飾的類(lei)、類(lei)屬變(bian)量(liang)及方法(fa),只有本類(lei)可以訪(fang)問,而包(bao)內包(bao)外的任何類(lei)均不能訪(fang)問它。
(1)適用范(fan)圍(wei)<訪問權(quan)限范(fan)圍(wei)越(yue)小,安全性越(yue)高>,如(ru)圖所示:

(2)類的修(xiu)飾符:public:主(zhu)類。 一個文件中(zhong)只能有一個主(zhu)類。 主(zhu)類整個項目下都可以使用。
default:其他類。不能跨包使用。
成員(yuan)(變(bian)量和方法(fa) ,本包(bao)可以使用。成員(yuan)變(bian)量成員(yuan)方法(fa)):public protected default private
public:在整(zheng)個(ge)項(xiang)目(mu)下都可(ke)以使用。
default:在本包(bao)內可以使用,不能(neng)跨包(bao)。
private:只有本類可以(yi)使用。其(qi)他(ta)類都(dou)不能使用。
protected:不能跨包,但是跨包類如(ru)果是該類的子類,就可以用。用super來(lai)訪問父類的成(cheng)員
構造方法:
public protected default private和成(cheng)員的使用是一樣的,沒有任何區別。
例:
package com.fs.test;
import com.fs.TestAccess02;
/*為什么protected修飾的(de)成(cheng)員變量hight 可以(yi)在(zai)B類(lei)使用 A類(lei)就不行、
*
* 因為protected修飾的(de)關(guan)鍵字,雖(sui)然不(bu)能跨包使用(yong)。但是(shi)可以在子類中使用(yong)。
*
* */
public class A {
public static void main(String[] args) {
//Test1是public修飾的類,是可以跨包使用的。
TestAccess02 t =new TestAccess02();
//default修飾的類,在其(qi)他包中不能使(shi)用。
// T t2 =new T();
//public修(xiu)飾的(de)成員變量age 是可(ke)以跨(kua)包使用的(de)。
System.out.println(t.age);
//default修飾的成員(yuan)變(bian)量name。 不可以(yi)跨包使用(yong)
// System.out.println(t.name);
//protected修飾的成員變量hight 不能跨包使(shi)用。
// System.out.println(t.hight);
}
}
class B extends TestAccess02{
public void method(){
//protected修飾的成員變量hight 可以(yi)在不同包子類中使用。
System.out.println(super.hight);
}
}
TestAccess02位于:package com.fs
A位于:package com.fs.test
B 位于:package com.fs.test,但是卻是TestAccess02的子類
結論:protected修(xiu)飾(shi)符所(suo)修(xiu)飾(shi)的(de)(de)類(lei)(lei)(lei)(lei)(這句話(hua)中(zhong)指父類(lei)(lei)(lei)(lei))屬成員變(bian)量和方(fang)法,只可(ke)以被子(zi)類(lei)(lei)(lei)(lei)訪(fang)問,而(er)(er)不(bu)(bu)管(guan)子(zi)類(lei)(lei)(lei)(lei)是(shi)不(bu)(bu)是(shi)和父類(lei)(lei)(lei)(lei)位于(yu)同一個(ge)包中(zhong)。default修(xiu)飾(shi)符所(suo)修(xiu)飾(shi)的(de)(de)類(lei)(lei)(lei)(lei)屬成員變(bian)量和方(fang)法,只可(ke)被同一個(ge)包中(zhong)的(de)(de)其他(ta)類(lei)(lei)(lei)(lei)訪(fang)問,而(er)(er)不(bu)(bu)管(guan)其他(ta)類(lei)(lei)(lei)(lei)是(shi)不(bu)(bu)是(shi)該類(lei)(lei)(lei)(lei)的(de)(de)子(zi)類(lei)(lei)(lei)(lei)。protected屬于(yu)子(zi)類(lei)(lei)(lei)(lei)限(xian)制(zhi)修(xiu)飾(shi)符,而(er)(er)default屬于(yu)包限(xian)制(zhi)修(xiu)飾(shi)符。

