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