2014-07-23 115 views
3

我對編程一般都比較陌生,我想知道是否有人可以幫助我理解訪問修飾符的用途?我明白他們爲類和變量設置不同級別的訪問權限,但爲什麼你想限制什麼訪問這些?什麼是不允許訪問不同的東西?爲什麼不只是允許訪問一切?

對不起,如果這是一個愚蠢的問題!訪問修飾符 - 目的是什麼?

回答

3

有千千萬萬的理由,但我會從here引用幾個,然後在這些展開:


隱藏物體的內部通過防止用戶設置內部保護其完整性組件的數據進入無效或不一致的狀態。

類型強制執行某些不變量的情況非常普遍(例如,一個人的ID號必須始終爲8個字符長)。如果一個客戶可以完全訪問一個類的每個成員,那麼你無法執行這些約束。這裏有一個具體的例子:

public class Person 
{ 
    public string Id; 

    public void SetId(string newId) 
    { 
     if(newId.Length != 8) 
      throw new InvalidArgumentException("newId"); 

     Id = newId; 
    } 
} 

沒有什麼阻止我剛剛訪問Id領域並將其設置爲我想做的事情!我可以這樣做:

Person p = new Person(); 
p.Id = "Invalid Id"; 

這就是爲什麼你的私有狀態需要私人


封裝的假定的好處是,它可以降低系統複雜度,並因此增加魯棒性,通過使顯影劑限制軟件組件之間的相互依存關係。

假設我開發了一個包含40個方法的類,其中35個用於連接類的內部並實現其功能,其中5個對客戶端來說非常重要。現在我給你這個課程供你使用 - 你看看它的公共接口,你會看到40種方法,其中大部分是完全與你無關,你問我「這個代碼是什麼意思?」

爲了確保類型的意圖是明確的,您限制任何與客戶端無關的成員的訪問。

此外,更多的公衆成員=更大的公共表面=更多需要測試的東西=難以維護。


作爲一個經驗法則,儘量讓您的會員儘可能私人,然後從那裏開始工作。例如,從private開始,然後:

  1. Do/would派生類需要訪問此成員嗎?如果是這樣,請推薦到protected
  2. 其他課程是否需要訪問該成員?如果是這樣,推廣到public
+0

當你在一個程序員團隊中時,非常有用,在這個團隊中,一個團隊做後臺,而另一個團隊做前臺。前端程序員不需要知道他們需要顯示的數據,只要他們正在獲取數據。 – DarkBee

+0

非常感謝,非常好的答案,非常簡潔。 –

1

實際上,修飾符用於將建模的訪問限制爲與真實生活對象相似。 訪問修飾符

  1. 私人
  2. 保護
  3. 默認
  4. 公共

公共訪問修飾符

字段,方法和構造函數聲明爲public(最少限制)公共類中對於Java程序中的任何類都是可見的,無論這些類是否爲ar e在同一個包或另一個包中。

私有訪問修飾符

私人(最限制性的)字段或方法不能用於類和接口。它也不能用於接口中的字段和方法。聲明爲私有的字段,方法或構造函數受到嚴格控制,這意味着它們不能在封閉類之外的任何地方訪問。標準的設計策略是使所有領域都是私密的,併爲他們提供公共的getter方法。

受保護的訪問修飾符

受保護的字段或方法不能用於類和接口。它也不能用於接口中的字段和方法。聲明在超類中保護的字段,方法和構造函數只能由其他包中的子類訪問。同一包中的類也可以訪問受保護的字段,方法和構造函數,即使它們不是受保護成員類的子類。

默認訪問修飾符

Java提供當沒有訪問改性劑的存在,其中使用默認說明符。任何沒有聲明訪問修飾符的類,字段,方法或構造函數只能由同一個包中的類訪問。默認修飾符不用於接口中的字段和方法。

+2

這並沒有回答這個問題。 OP想知道爲什麼我們需要他們,而不是他們做什麼。 – dcastro