2011-06-03 36 views
44

一般來說,將私有類聲明爲靜態是否有任何好處?什麼時候我想讓我的私人類是靜態的?

在哪些情況下,我想使用以下其中一種:

private static class Foo 
{ 
    ... 
} 

VS

private class Foo 
{ 
    ... 
} 
+1

的[Java的內部類和靜態嵌套類(HTTP ://stackoverflow.com/questions/70324/java-inner-class-and-static-nested-class)也許有幫助。 – MockerTim 2011-06-03 05:05:02

+0

你可能會發現在這篇文章中的第二個答案有幫助: http://stackoverflow.com/questions/1844355/java-static-class – gwood 2011-06-03 05:06:03

回答

2

如果您需要訪問成員變量/封裝類的方法,使用非靜態的形式。如果你不這樣做,請使用靜態表單。

+1

這是不好的答案。即使從靜態類,如果我得到父類的對象的引用,我可以訪問私有成員。 – 2011-06-03 05:11:05

+0

但是,你爲什麼?如果你需要訪問私有變量,並且它是一個內部類,只需使其成爲非靜態的而不是靜態的,並將引用傳遞給父類。 – 2011-06-03 05:27:22

+0

他們是不同的概念。非靜態的(即內部)類具有對父類對象的隱式引用。所以,如果沒有父類的對象,你就不能擁有內部類的對象。一個例子是Map.Entry(或更好的迭代器) - 它需要引用父映射對象。一個靜態嵌套類的例子是Builder,它需要訪問父類的私有構造函數 – 2011-06-03 05:33:57

-1

靜態類與普通類的區別僅在於它們可以在不創建實例的情況下訪問。所以如果你需要一些類可以每次訪問,使用靜態

+2

我不認爲他問什麼是靜態類。 – BBdev 2011-06-03 05:21:37

1

我會假設你指的是內部類。

我認爲動機將來自於你想如何聯繫你的內心階層。如果你想讓你的內部類與外部類的特定實例相關聯,你可以使用private class,否則使用private static class

+0

我很確定'private'和「inner」類是同義詞。 – 2018-02-28 00:45:14

27

我覺得這是一個很好的起點: http://java67.blogspot.fi/2012/10/nested-class-java-static-vs-non-static-inner.html

1)嵌套靜態類不需要外部類,但非 靜態嵌套類或內部類的引用,需要外部類的參考。您無法創建內部類的實例,而無需創建 外部類的實例 。這是迄今爲止最重要的事情要考慮,而 使嵌套類靜態或非靜態。

2)靜態類實際上是類的靜態成員,可用於靜態上下文中的例如 。外部類的靜態方法或靜態塊。

3)靜態和非靜態嵌套類的另一個區別是 ,您不能訪問非靜態成員,例如方法和字段直接嵌入到 嵌套靜態類。如果你這樣做,你會得到像「非 靜態成員不能在靜態上下文中使用」的錯誤。而內部類 可以訪問外部類的靜態和非靜態成員。

+2

這應該是被接受的答案。 – Dave 2015-03-27 08:23:37

+0

但是,我們使用'private',它仍然可以訪問嗎? – 2017-06-13 05:22:40

+1

它只能在嵌套類中訪問,而不能在外部世界作爲嵌套類的私有 – 2017-06-30 12:57:38

0

我發現它在通用抽象類中有一個特定的異常很有用。即:

public abstract class AbstractClass <T> 
{ 
    private void doSomethingOrThrowException() throws SpecificException 
    { 
     .... 

     if (! successful) 
     { 
      throw new SpecificException(); 
     } 
    } 

    private static class SpecificException extends Exception {} 
} 

如果我要離開了靜態,編譯器會給我指出一個錯誤:The generic class AbstractClass<T>.SpecificException may not subclass java.lang.Throwable

相關問題