天天看點

Java和C#預設通路修飾符

C#中:

針對下面幾種類型内部成員的通路修飾符:

enum的預設通路修飾符:public。

class的預設為private。

interface預設為public。

struct預設為private。 

其中: 

public可以被任意存取; 

protected隻可以被本類和其繼承子類存取; 

internal隻可以被本組合體(Assembly)内所有的類存取,組合體是C#語言中類被組合後的邏輯機關和實體機關,其編譯後的檔案擴充名往往是 “.DLL”或“.EXE”。 

protected internal唯一的一種組合限制修飾符,它隻可以被本組合體内所有的類和這些類的繼承子類所存取。 

private隻可以被本類所存取。

看:

c# 的通路修飾符是private 還是 internal? 

準确的說,不能一概而論。 

[MSDN] 

Classes and structs that are not nested within other classes or structs can be either public or internal. A type deleted as public is accessible by any other type. A type deleted as internal is only accessible by types within the same assembly. Classes and structs are deleted as internal by default unless the keyword public is added to the class definition, as in the previous example. Class or struct definitions can add the internal keyword to make their access level explicit. Access modifiers do not affect the class or struct itself — it always has access to itself and all of its own members. 

類(class)或結構(struct)如果不是在其它類或結構中的話,它的通路類型要不就是internal, 要不就是public; 

換句話說,如果它在其它類或結構中的話,則可以為private 或protected等。下面我說的類和結構,如無特殊說明,均指非"類中類" 

類或結構的預設通路類型是internal. 

類中所有的成員,預設均為private。 

Interfaces, like classes, can be deleted as public or internal types. Unlike classes, interfaces default to internal access. Interface members are always public, and no access modifiers can be applied. 

Namespaces and enumeration members are always public, and no access modifiers can be applied. 

Delegates have internal access by default. 

Any types deleted within a namespace or at the top level of a compilation unit (for example, not within a namespace, class, or struct) are internal by default, but can be made public. 

接口預設通路符是internal 

接口的成員預設通路修飾符是public,也不可能是其他通路修飾符 

命名空間,枚舉類型成員預設public,也不可能是其他通路修飾符 

委托,預設internal 

在命名空間内部或編譯單元頂部的所有類型,預設是internal,可以人為改為public。

java

1、Class類的通路權限: 

預設:預設可以稱為friendly但是,java語言中是沒有friendly這 個修飾符的,這樣稱呼應該是來源于c++。預設的通路權限是包級通路權限。 

即如果寫了一個類沒有寫通路權限修飾符,那麼就是預設的通路權限,同一個包下的類都可以通路到,即使可以執行個體化該類 (當然如果這個類不具有執行個體化的能力除外,比如該類沒有提供public的構造函數)。

public:可以供所有的類通路。 

說明: 

1)、每個編譯單元(類檔案)都僅能有一個public class 。

2)、public class的名稱(包含大小寫)必須和其類檔案同名。 

3)、一個類檔案(*.java)中可以不存在public class。 

這種形式的存在的場景:如果我們在某個包内撰寫一個class,僅僅是為了配合同包内的其他類工作。

4)、class不可以是private和protected。 

5)、如果不希望那個任何産生某個class的對象,可以将該類得所有構造函數設定成private。但是即使這樣也可以生成該類的對象,就是class的 static的成員(屬性和方法)可以辦到。 

2、類成員變量的通路權限: 

public:緊接public的屬性任何類都可以通路到。但是從類的封裝性上來考 慮将一個類的屬性定義成public一般很少使用, 在定義靜态常量的時候通暢會這樣定義。如:public static final int PAGE_SIZE=10; 

private:隻有類本身内部的方法可以通路類的private屬性,當然内部類也可以通路其外部類的private成員的。(屬性和方法) 

預設(friendly):包級可見,同一個包内的類可以通路到這個屬性但 是從類的封裝性特性來說很少這樣使用類的屬性的。 

protected:關鍵字所處理的是所謂“繼承”的觀念。對于同一包的其他類,protected=預設,對于不同包的類,如果存在繼承關系, 而baseClass存在protected屬性,則可以被其自繼承,而不同包的其他類 

則不能通路類的protected屬性。 

3、類的成員方法的通路權限: 

其從文法角度來講,這些通路權限控制符作用于類的方法和作用于類的屬性上的效果是一樣的。 

public:所有類可見。 

pirvate:隻有同一類内部的方法可見,在有就是内部類也可以通路到。 

預設(friendly):包内可見。 

protected:繼承可見。 

通路權限存在的理由

1)、“讓使用者無法碰觸到他們不該碰觸的東西。”這些東西僅供類的内部機制使用。将某些成員聲明成private,對于使用者來說可以說是一種服 務, 

因為這樣使用者可以知道哪些是他關注的哪些是不重要的,不需要關注,如此曆來對于使用來說降低了對使用對象認識的難度。 

2)、(最重要的理由)讓程式設計者可以更動class内部運作方式,而無須擔心波及到用戶端程式。 

3)、java的“通路權限修飾符”賦予classes開發者極具有價值的控制能力。 身為classes開發者,如果你的任何改變可以完全不幹擾你的使用者, 

你便可以安心改變你的底層實作,因為用戶端程式員無法通路class的這一部分。 

通過今天學習通路權限的問題了解到,接口或者抽象等等政策所謂的“實作隐藏”其根本原因并不是說為了隐藏實作的代碼和思路,而是降低使用者的使用 難度,以及從維護角度來說可見範圍的控制給程式維護帶來了極大的安全性。

本文轉自 dogegg250 51CTO部落格,原文連結:http://blog.51cto.com/jianshusoft/634345,如需轉載請自行聯系原作者