一般來說,將私有類聲明爲靜態是否有任何好處?什麼時候我想讓我的私人類是靜態的?
在哪些情況下,我想使用以下其中一種:
private static class Foo
{
...
}
VS
private class Foo
{
...
}
一般來說,將私有類聲明爲靜態是否有任何好處?什麼時候我想讓我的私人類是靜態的?
在哪些情況下,我想使用以下其中一種:
private static class Foo
{
...
}
VS
private class Foo
{
...
}
如果您需要訪問成員變量/封裝類的方法,使用非靜態的形式。如果你不這樣做,請使用靜態表單。
這是不好的答案。即使從靜態類,如果我得到父類的對象的引用,我可以訪問私有成員。 – 2011-06-03 05:11:05
但是,你爲什麼?如果你需要訪問私有變量,並且它是一個內部類,只需使其成爲非靜態的而不是靜態的,並將引用傳遞給父類。 – 2011-06-03 05:27:22
他們是不同的概念。非靜態的(即內部)類具有對父類對象的隱式引用。所以,如果沒有父類的對象,你就不能擁有內部類的對象。一個例子是Map.Entry(或更好的迭代器) - 它需要引用父映射對象。一個靜態嵌套類的例子是Builder,它需要訪問父類的私有構造函數 – 2011-06-03 05:33:57
我會假設你指的是內部類。
我認爲動機將來自於你想如何聯繫你的內心階層。如果你想讓你的內部類與外部類的特定實例相關聯,你可以使用private class
,否則使用private static class
。
我很確定'private'和「inner」類是同義詞。 – 2018-02-28 00:45:14
我覺得這是一個很好的起點: http://java67.blogspot.fi/2012/10/nested-class-java-static-vs-non-static-inner.html
1)嵌套靜態類不需要外部類,但非 靜態嵌套類或內部類的引用,需要外部類的參考。您無法創建內部類的實例,而無需創建 外部類的實例 。這是迄今爲止最重要的事情要考慮,而 使嵌套類靜態或非靜態。
2)靜態類實際上是類的靜態成員,可用於靜態上下文中的例如 。外部類的靜態方法或靜態塊。
3)靜態和非靜態嵌套類的另一個區別是 ,您不能訪問非靜態成員,例如方法和字段直接嵌入到 嵌套靜態類。如果你這樣做,你會得到像「非 靜態成員不能在靜態上下文中使用」的錯誤。而內部類 可以訪問外部類的靜態和非靜態成員。
這應該是被接受的答案。 – Dave 2015-03-27 08:23:37
但是,我們使用'private',它仍然可以訪問嗎? – 2017-06-13 05:22:40
它只能在嵌套類中訪問,而不能在外部世界作爲嵌套類的私有 – 2017-06-30 12:57:38
我發現它在通用抽象類中有一個特定的異常很有用。即:
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
的[Java的內部類和靜態嵌套類(HTTP ://stackoverflow.com/questions/70324/java-inner-class-and-static-nested-class)也許有幫助。 – MockerTim 2011-06-03 05:05:02
你可能會發現在這篇文章中的第二個答案有幫助: http://stackoverflow.com/questions/1844355/java-static-class – gwood 2011-06-03 05:06:03