<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                ## [類訪問權限](https://lingcoder.gitee.io/onjava8/#/book/07-Implementation-Hiding?id=%e7%b1%bb%e8%ae%bf%e9%97%ae%e6%9d%83%e9%99%90) 訪問權限修飾符也可以用于確定類庫中的哪些類對于類庫的使用者是可用的。如果希望某個類可以被客戶端程序員使用,就把關鍵字**public**作用于整個類的定義。這甚至控制著客戶端程序員能否創建類的對象。 為了控制一個類的訪問權限,修飾符必須出現在關鍵字**class**之前: ~~~ public class Widget { ~~~ 如果你的類庫名是**hiding**,那么任何客戶端程序員都可以通過如下聲明訪問**Widget**: ~~~ import hiding.Widget; ~~~ 或者 ~~~ import hiding.*; ~~~ 這里有一些額外的限制: 1. 每個編譯單元(即每個文件)中只能有一個**public**類。這表示,每個編譯單元有一個公共的接口用**public**類表示。該接口可以包含許多支持包訪問權限的類。一旦一個編譯單元中出現一個以上的**public**類,編譯就會報錯。 2. **public**類的名稱必須與含有該編譯單元的文件名相同,包括大小寫。所以對于**Widget**來說,文件名必須是**Widget.java**,不能是**widget.java**或**WIDGET.java**。再次強調,如果名字不匹配,編譯器會報錯。 3. 雖然不是很常見,但是編譯單元內沒有**public**類也是可能的。這時可以隨意命名文件(盡管隨意命名會讓代碼的閱讀者和維護者感到困惑)。 如果是一個在**hiding**包中的類,只用來完成**Widget**或**hiding**包下一些其他**public**類所要執行的任務,怎么設置它的訪問權限呢? 你不想自找麻煩為客戶端程序員創建說明文檔,并且你認為不久后會完全改變原有方案并將舊版本刪除,替換成新版本。為了保留此靈活性,需要確保客戶端程序員不依賴隱藏在**hiding**中的任何特定細節,那么把**public**關鍵字從類中去掉,給予它包訪問權限,就可以了。 當你創建了一個包訪問權限的類,把類中的屬性聲明為**private**仍然是有意義的——應該盡可能將所有屬性都聲明為**private**,但是通常把方法聲明成與類(包訪問權限)相同的訪問權限也是合理的。一個包訪問權限的類只能被用于包內,除非強制將某些方法聲明為**public**,這種情況下,編譯器會告訴你。 注意,類既不能是**private**的(這樣除了該類自身,任何類都不能訪問它),也不能是**protected**的。所以對于類的訪問權限只有兩種選擇:包訪問權限或者**public**。為了防止類被外界訪問,可以將所有的構造器聲明為**private**,這樣只有你自己能創建對象(在類的 static 成員中): ~~~ // hiding/Lunch.java // Demonstrates class access specifiers. Make a class // effectively private with private constructors: class Soup1 { private Soup1() {} public static Soup1 makeSoup() { // [1] return new Soup1(); } } class Soup2 { private Soup2() {} private static Soup2 ps1 = new Soup2(); // [2] public static Soup2 access() { return ps1; } public void f() {} } // Only one public class allowed per file: public class Lunch { void testPrivate() { // Can't do this! Private constructor: //- Soup1 soup = new Soup1(); } void testStatic() { Soup1 soup = Soup1.makeSoup(); } void testSingleton() { Soup2.access().f(); } } ~~~ 可以像 \[1\] 那樣通過**static**方法創建對象,也可以像 \[2\] 那樣先創建一個靜態對象,當用戶需要訪問它時返回對象的引用即可。 到目前為止,大部分的方法要么返回 void,要么返回基本類型,所以 \[1\] 處的定義乍看之下會有點困惑。方法名(**makeSoup**)前面的**Soup1**表明了方法返回的類型。到目前為止,這里經常是**void**,即不返回任何東西。然而也可以返回對象的引用,就像這里一樣。這個方法返回了對**Soup1**類對象的引用。 **Soup1**和**Soup2**展示了如何通過將你所有的構造器聲明為**private**的方式防止直接創建某個類的對象。記住,如果你不顯式地創建構造器,編譯器會自動為你創建一個無參構造器(沒有參數的構造器)。如果我們編寫了無參構造器,那么編譯器就不會自動創建構造器了。將構造器聲明為**private**,那么誰也無法創建該類的對象了。但是現在別人該怎么使用這個類呢?上述例子給出了兩個選擇。在**Soup1**中,有一個**static**方法,它的作用是創建一個新的**Soup1**對象并返回對象的引用。如果想要在返回引用之前在**Soup1**上做一些額外操作,或是記錄創建了多少個**Soup1**對象(可以用來限制數量),這種做法是有用的。 **Soup2**用到了所謂的*設計模式*(design pattern)。這種模式叫做*單例模式*(singleton),因為它只允許創建類的一個對象。**Soup2**類的對象是作為**Soup2**的**static****private**成員而創建的,所以有且只有一個,你只能通過**public**修飾的`access()`方法訪問到這個對象。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看