我見過類在java
中被聲明,但是很困惑:
由於class用於創建對象,而不同的對象有不同的內存分配。
那麼什麼是"static"
用於聲明一個類時,是否表示member variables
都是static
?
這有道理嗎?爲什麼在Java中將類聲明爲static?
回答
首先,你不能讓頂級的靜態。你只能使一個嵌套類靜態。通過使嵌套類靜態化,你基本上說你不需要嵌套類的實例來從你的外部類/頂級類中使用它。
實施例:
class Outer {
static class nestedStaticClass {
//its member variables and methods (don't nessarily need to be static)
//but cannot access members of the enclosing class
}
public void OuterMethod(){
//can access members of nestedStaticClass w/o an instance
}
}
另外添加,它是非法的聲明一個內部類內部靜態字段,除非它們是常數(換言之,static final
)。由於靜態嵌套類不是內部類,所以你可以在這裏聲明靜態成員。
類可以嵌套在嵌套類嗎?
一句話,是的。看下面的Test
,嵌套的內部類和嵌套靜態類可以在嵌套類中嵌套。但是請記住,您只能在頂級類中聲明靜態類,因此在內部類中聲明它是非法的。
public class Test {
public class Inner1 {
public class Inner2 {
public class Inner3 {
}
}
}
public static class nested1 {
public static class nested2 {
public static class nested3 {
}
}
}
}
根據定義,內部類是非靜態的。 – assylias 2013-03-16 10:57:55
@assylias true .. :),編輯 – PermGenError 2013-03-16 10:59:01
@ PermGenError,所以最多有兩個級別。 – Al2O3 2013-03-16 11:04:58
嵌套類(一個類內的類)是唯一可以聲明爲靜態的類。這是因爲父類不必被實例化來訪問嵌套類。
有一個在this answer
一些很好的示例代碼它只是描述這班與包含類的關係。
內部類是在另一個類的範圍內定義的類。內部類的實例被附加到容器類的特定實例(它們被創建的實例)。
靜態嵌套類是嵌套類,但被定義爲靜態。與靜態成員一樣,它們與特定實例沒有關係;他們只屬於包含類。在嵌套類中,不能引用包含類的非靜態成員/方法,因爲沒有與它們關聯的特定實例。
- 1. 爲什麼在Spring中將方法聲明爲static?
- 2. 爲什麼在Objective-c類方法中將變量聲明爲static?
- 3. 爲什麼默認情況下,varibale在c中聲明爲static?
- 4. 爲什麼System類在Java中聲明爲「final」?
- 5. 爲什麼不能將Java類聲明爲靜態?
- 6. 爲什麼在相同的頭文件中聲明一個類爲類聲明
- 7. 爲什麼要在Java中聲明一個不可變類final?
- 8. 爲什麼在Java的Object類中聲明wait()和notify()?
- 9. 爲什麼我們在java中聲明變量爲private
- 10. 爲什麼Java變量聲明中的類型不同?
- 11. 爲什麼open在fcntl.h中聲明,而close在unistd.h中聲明?
- 12. 爲什麼返回類型void在.NET中聲明爲struct?
- 13. 爲什麼WKInterfacePicker會將其視爲未聲明的類型?
- 14. 爲什麼我不能將obj類聲明爲public?
- 15. 爲什麼要找到類型聲明?
- 16. 什麼類型可以聲明爲const?
- 17. 這個聲明`int fun-name(static int)`在C++中有效,爲什麼?
- 18. 函數聲明爲static但從定義
- 19. 爲什麼要在$(function(){...})中聲明?
- 20. 爲什麼在Java中將數組聲明爲正確的對象?
- 21. 在java類中聲明一個變量(private,static,final)
- 22. 爲什麼我們要在普通類中聲明靜態類?
- 23. 爲什麼在CakePHP中將debug更改爲0 break static pages?
- 24. 爲什麼我不能在類聲明中使用「使用」聲明?
- 25. 爲什麼try catch中的「catch」聲明類型爲$ e
- 26. 爲什麼不能在F#中的函數中聲明類型?
- 27. 爲什麼在android中使用[static final]?
- 28. 爲什麼C++模板參數應該聲明爲類類型?
- 29. Java爲抽象類聲明類?
- 30. 爲什麼WebMethod聲明爲靜態?
請參閱[此答案](http://stackoverflow.com/a/3584151/545637)。 – Apalala 2013-03-16 10:54:17