2013-10-23 65 views
0

我的印象是,一個私有的內部/嵌套類僅用於/ by /由外部類訪問。但是在實驗中我意識到HashSet(不是Happy的外層類)可以訪問這個類。如果是的話,那麼private的真實用途是什麼?是否只限制創建類到外部類?私有嵌套/內部類的目的是什麼?

public class FreeMain { 

    private static class Happy { 
     int x; 
     private Happy(int x) { 
      this.x = x; 
     } 

     @Override 
     public boolean equals(Object o) { 
      return true; 
     } 

     @Override 
     public int hashCode() { 
      return 10; 
     } 
    } 

    public static void main(String[] args) { 
     Set<Happy> happiness = new HashSet<Happy>(); 

     Happy h1 = new Happy(10); 
     Happy h2 = new Happy(20); 

     happiness.add(h1); 
     happiness.add(h2); 
    } 
} 
+0

已經有一段時間了,但是類HashSet不能夠把它放在FreeMain中並訪問它內部的私有類或變量(沿着class.variable或class.innerclass的行。但是我認爲(未經測試)如果你創建了你的私人類的一個實例並將它傳遞給某人,那麼它就可以使用它了,而且當我很早以前學習java時,它沒有Set <...>,所以我不知道它 – barlop

+0

甚至* what * HashSet?你的問題是什麼? – EJP

回答

3

Access modifiers in Java控制範圍其中可以合法地訪問或引用標識符。您正在使用您的私有嵌套(靜態=>嵌套,非靜態=>內部)類作爲HashSet的類型參數 - 但引用仍在父類的範圍內發生。

如果是的話那麼Private的真正用途是什麼?它是否僅限於在外部類中創建類?

不,它不會限制創建。您甚至不能在FreeMain類之外引用Happy類型。如果您嘗試聲明類型爲Happy或使用Happy作爲FreeMain類之外的類型參數(如Set<Happy>),則會出現編譯器錯誤。


總之,如果提到私人嵌套類傳遞到另一個類(如套),這麼久的工作及其在freemain範圍。

是的,這基本上是正確的。但是,當您聲明Set<Happy>時,該類型並未真正「通過」到SetSet類中的代碼都沒有看到您在參數中提供的實際類型(由於type erasure)。 Java編譯器只是使用您在類型參數中指定的信息作爲一種類型斷言來檢查程序的正確性。

當你聲明Set<Happy> happiness,該happiness包含Happy情況下,實際上沒有任何地方,但的happiness範圍內已知。因此,Happy類型實際上從未在FreeMain類的範圍外實際使用,因此即使Happy是私有的,它也是合法的。

+0

總而言之,如果引用私有嵌套類傳遞給另一個類(比如set),只要它在freemain範圍內就可以工作。 – JavaDeveloper

+0

@JavaDeveloper - 是的,基本上是正確的。答覆。 – DaoWen

+0

@DaoWan很好的回答。謝謝!! – JavaDeveloper

0

使用嵌套類令人信服的理由包括:

這是邏輯上分組的是隻在一個地方使用的類的方式:如果一個類是有用的僅一個其它類,然後將其將它嵌入到這個類中是合乎邏輯的,並把它們放在一起。嵌套這樣的「幫助類」使得它們的包更加簡化。

它增加了封裝:考慮兩個頂級類A和B,其中B需要訪問A的成員,否則這些成員將被聲明爲私有。通過在類A中隱藏類B,可以將A的成員聲明爲私有,並且B可以訪問它們。另外,B本身可以被外界隱藏起來。

它可以導致更具可讀性和可維護性的代碼:在頂級類中嵌套小類會使代碼更靠近它的使用位置。

+0

我的問題是使內部/嵌套類成爲一個私有類的好處/使用。謝謝你的回答,但問題不同。 – JavaDeveloper