public,private,protected访问权限在Java,C++中的解析
Java中:
Java中的訪問權(quán)限有public,private,protected和默認(rèn)的包訪問權(quán)限,如果類中的屬性方法沒有顯示的指明訪問權(quán)限,則具有包訪問權(quán)限,我喜歡稱它為packeged權(quán)限,很多人也稱它為friendly訪問權(quán)限,而packaged和friendly這兩個(gè)關(guān)鍵字在實(shí)際中都是不存在的。
詳細(xì)解釋,我引別人的一篇博客,說明:
java訪問權(quán)限修飾符public? protected? friendly private用法總結(jié)?????? 首先聲明:java中,friendly這個(gè)修飾符并沒有顯式的聲明,在成員變量和方法前什么修飾符也不用,默認(rèn)的就是friendly。
??? 為了條理清晰,分三種不同情況來總結(jié)。
 ???一 訪問權(quán)限修飾符修飾成員變量和方法
 ???public:表明該成員變量和方法是共有的,能在任何情況下被訪問。
 ???
 ???protected:必須在同一包中才能被訪問。(說的比較簡單,看個(gè)例子就明白了)????
 ?????? eg:class A
 ????????? {?
 ??????????? protected int weight ;
 ??????????? protected int f( int a,int b?? )???
 ??????????? {
 ????????????? // 方法體
 ??????????? }
 ?????????? }??????
 ?????? 假設(shè)B與A在同一個(gè)包中,則
 ?????????? class B
 ????????? {
 ??????????? void g()
 ??????????? {
 ????????????? A a=new A();
 ????????????? A.weight=100;//合法
 ????????????? A.f(3,4);??? //合法
 ???????????? }
 ?????????? }
 ???特別說明:什么是在同一個(gè)包中?
 ?? 答:用package打包在一起的class ,叫在同一個(gè)包中。(不明白,舉個(gè)例子)
 ?????? eg:在JDK的src\java\io中,你會(huì)看到許多java類,第一句源代碼都是package java.io;
 ?????? 沒有使用package打包的,在同一目錄下的類也會(huì)被視做同一個(gè)包。
 ???
 ???friendly:在這種情況下中,同protected。區(qū)別在第二和第三種情況中。?
 ?????? eg: class A
 ????????? {?
 ??????????? int weight ;
 ??????????? int f( int a,int b?? )???
 ??????????? {
 ????????????? // 方法體
 ??????????? }
 ?????????? }??????
 ?????? 假設(shè)B與A在同一個(gè)包中,則
 ?????????? class B
 ????????? {
 ??????????? void g()
 ??????????? {
 ????????????? A a=new A();
 ????????????? A.weight=100;//合法
 ????????????? A.f(3,4);??? //合法
 ???????????? }
 ?????????? }
 ????private:?只能在本類中訪問。
 ???????????? eg:??? class?? Test
 ??????????????????? {??
 ?????????????????????? private int money;
 ?????????????????????? Test()
 ?????????????????????? {
 ????????????????????????? money=2000;
 ?????????????????????? }
 ?????????????????????? private int getMoney()
 ?????????????????????? {
 ???????????????????????? return money;
 ??????????????????????? }
 ???????????????????? public? static? void main(String args[])
 ???????????????????? {
 ???????????????????????? Test te=new? Test();
 ???????????????????????? te.money=3000;???????????? //合法
 ???????????????????????? int m=te.getMoney();?????? //合法
 ???????????????????????? System.out.println("money="+m);
 ????????????????????? }
 ???????????????????? }
 ???????????????????
 ?? PS: 實(shí)際上,把重要的數(shù)據(jù)修飾為private,然后寫一個(gè)public的函數(shù)訪問它,正好體現(xiàn)了OOP的封裝特性,是OOP安全性的體現(xiàn)。
 ???
二? 訪問權(quán)限修飾符修飾類
 ?? 1,不能用protected和private修飾類。
 ?? 2,用friendly修飾的類叫友好類,在另外一個(gè)類中使用友好類創(chuàng)建對象時(shí),要保證它們在同一包中。
三?? 訪問權(quán)限修飾符與繼承
 ?? 這里的訪問修飾符指的是修飾成員變量和方法。可以分為兩種情況:
 ?? 1,子類與父類在同一包中
 ??? 此時(shí)只有聲明為private的變量與方法不能被繼承(訪問)。
 ?? eg:
 ???? class Father
 ???? {
 ?????? private int money ;
 ?????? int weight=100;
 ???????
 ????? }
 ???? class Son extends Father
 ???? {
 ?????? viod f()
 ?????? {
 ???????? money=10000;//?? 非法
 ???????? weight=100; //?? 合法
 ??????? }
 ????? }
 ??? 2,子類與父類不在同一包中
 ??? 此時(shí)private與friendly均不能被繼承(訪問), protected與public可以。
 ???? eg:
 ?????? Father.java
????? package com.aaa
 ????? public class Father
 ???? {
 ?????? int height ;
 ?????? protected? int money=120;
 ?????? public int weight;
 ?????? protected int getMoney()
 ?????? {
 ???????? return money;
 ?????? }
 ?????? void setMoney(int newMoney)
 ?????? {
 ???????? money=newMoney;
 ?????? }
 ????? }
 ?????
 ????? Son.java
 ????? package com.bbb
 ????? import com.aaa.Father;
 ????? public class Son extends Father
 ????? {
 ???????? void f()
 ???????? {
 ?????????? money=10000;//合法
 ?????????? //height=170;//非法,height為friendly修飾的變量
 ?????????? System.out.println(money);//輸出結(jié)果是10000
 ?????????? //setMoney(300);????????? //非法
 ?????????? int number=getMoney();??? //合法
 ?????????? System.out.println(number);//輸出結(jié)果是10000
 ????????? }
 ?????????? public? static? void main(String args[])
 ????????? {
 ??????????? Son sss=new Son();
 ??????????? sss.f();
 ?????????? }
 ?????? }
 ??所以,訪問權(quán)限修飾符權(quán)限從高到低排列是public? ,protected? ,friendly, private。
?
C++中
由于不存在包的概念,因此,protected與java中的protected有所不同,Java中的protected不但,子對象可以訪問,而且包里的其它地方,也可以顯示的通過子對象調(diào)用,如
package pack1
public class A{
???? protected int a;
}
package pack1
public class B{
???? public static void main(String[] args){
????????? System.out.println(a);
???? }
}
上述代碼是沒有問題的,但如果B與A不在同一個(gè)包中,則不能訪問。因此,在Java中,protected在可見性在與packaged權(quán)限類似,而只是在繼承性上,沒有對包劃界,packaged權(quán)限不允許子象訪問其它包內(nèi)父對象的包訪問權(quán)限的屬性。
在C++里,protected屬性有嚴(yán)格的定義,即只具有垂直的訪問權(quán)限,只有其自身與其后代可以訪問,限一個(gè)類的protected屬性,只有其內(nèi)部與子對象內(nèi)部可以訪問,而在其它地方是不可見的,為了說明這個(gè)問題,見以下代碼:
class A{
 protected:?
 ?int a;
 protected:?
 ?void print(){
 ??cout<<"A protected method"<<endl;
 ?}
 };
 class B:public A{
 protected:
 ?void test(){
 ??cout<<"test A"<<endl;
 ?}
 };
 int main(){
 ?B b;
 ?b.test();
 ?//b.print();
 }
上述代碼是無法編譯的,因?yàn)閎.test()在main里是不可見的,main無法訪問b的protected方法,即使方法是通過子對象來調(diào)用的,如果把B中的protected方法改為public,則代碼可以,編譯成功,編譯成功后,在B中可以房問父類的protected屬性.
下表列出了C++三種繼承對屬性的訪問情況:
public屬性???????? protected屬性????????? private屬性
public繼承??????????????? public????????????? protected?????????????? 不可見
protected繼承??????????protected???????? protected?????????????? 不可見
private繼承 private??????????? private???????????????????不可見
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀
總結(jié)
以上是生活随笔為你收集整理的public,private,protected访问权限在Java,C++中的解析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: JDK、J2EE、J2SE、J2ME的区
 - 下一篇: Java.util.Random 各种方