天天看點

public、 private、protected 和 friendly

在 Java 語言中提供了多個作用域修飾符,其中常用的有 public、private、protected、final、abstract、static、transient 和 volatile,這些修飾符有類修飾符、變量修飾符和方法修飾符。本文将詳細介紹通路控制修飾符。

在實際生活中,如果要擷取某件物品,與其直接穿過堡壘的牆壁,進而導緻牆壁毀滅和破壞,不如通過門口的警衛請求進入堡壘的許可。一般而言,這對對象同樣适用:沒有對象的許可(即對象的屬性是私有的),不能直接通路該對象的私有屬性。

資訊隐藏是 OOP 最重要的功能之一,也是使用通路修飾符的原因。在編寫程式時,有些核心資料往往不希望被使用者調用,需要控制這些資料的通路。

對類成員通路的限制是面向對象程式設計的一個基礎,這有利于防止對象的誤用。隻允許通過一系列定義完善的方法來通路私有資料,就可以(通過執行範圍檢查)防止資料賦予不正當的值。例如,類以外的代碼不可能直接向一個私有成員指派。同時,還可以精确地控制如何以及何時使用對象中的資料。

當正确實作對類成員的方法控制後,類就可以建立一個可用的“黑箱”,其内部動作不會被打開而任意篡改。

通過使用通路控制修飾符來限制對對象私有屬性的通路,可以獲得 3 個重要的好處。

防止對封裝資料的未授權通路。

有助于保證資料完整性。

當類的私有實作細節必須改變時,可以限制發生在整個應用程式中的“連鎖反應”。

通路控制符是一組限定類、屬性或方法是否可以被程式裡的其他部分通路和調用的修飾符。類的通路控制符隻能是空或者 public,方法和屬性的通路控制符有 4 個,分别是 public、 private、protected 和 friendly,其中 friendly 是一種沒有定義專門的通路控制符的預設情況。通路控制修飾符的權限如表 1 所示。

public、 private、protected 和 friendly
通路控制在面向對象技術中處于很重要的地位,合理地使用通路控制符,可以通過降低類和類之間的耦合性(關聯性)來降低整個項目的複雜度,也便于整個項目的開發和維護。在 Java 語言中,通路控制修飾符有 4 種。

  1. private

    用 private 修飾的類成員,隻能被該類自身的方法通路和修改,而不能被任何其他類(包括該類的子類)通路和引用。是以,private 修飾符具有最高的保護級别。例如,設 PhoneCard 是電話卡類,電話卡都有密碼,是以該類有一個密碼域,可以把該類的密碼域聲明為私有成員。

  2. friendly(預設)

    如果一個類沒有通路控制符,說明它具有預設的通路控制特性。這種預設的通路控制權規定,該類隻能被同一個包中的類通路和引用,而不能被其他包中的類使用,即使其他包中有該類的子類。這種通路特性又稱為包通路性(package private)。

同樣,類内的成員如果沒有通路控制符,也說明它們具有包通路性,或稱為友元(friend)。定義在同一個檔案夾中的所有類屬于一個包,是以前面的程式要把使用者自定義的類放在同一個檔案夾中(Java 項目預設的包),以便不加修飾符也能運作。

  1. protected

    用保護通路控制符 protected 修飾的類成員可以被三種類所通路:該類自身、與它在同一個包中的其他類以及在其他包中的該類的子類。使用 protected 修飾符的主要作用,是允許其他包中它的子類來通路父類的特定屬性和方法,否則可以使用預設通路控制符。

繼續閱讀