2014-03-27 55 views
0

我可以在沒有編譯錯誤的情況下創建靜態內部類的實例。這是什麼意思? java如何讓一個人爲靜態類創建對象?請幫助我。java如何讓內部靜態類的實例化?

public class StringMatrix { 
    static class moves{ 
     int x; 
     int y; 
     moves(int x,int y){ 
      this.x=x; 
      this.y = y; 
     } 
     static moves[] movements = {new moves(0,1),new moves(1,1),new moves(0,-1),new moves(1,0),new moves(-1,0),new moves(-1,-1),new moves(-1,1),new moves(1,-1)}; 
    } 
} 
+1

哪部分你不明白?靜態,還是內部類? –

+2

骯髒的小祕密。 「靜態內部」類只是一個類,在任何其他類的字節碼級別上都是難以區分的。這只是一個編譯器調試(並命名爲「OuterClassName $ InnerClassName」),它使它特殊並限制對它的訪問。 –

回答

1

Java是允許創建靜態內部類。

靜態嵌套類與其外部類(和其他類)的實例成員交互,就像任何其他頂級類一樣。實際上,爲了方便打包,靜態嵌套類在行爲上是嵌套在另一個頂級類中的頂級類。

您可以訪問靜態嵌套類使用封閉的類名訪問: 像

StringMatrix.moves 

我們爲什麼需要靜態嵌套類?

靜態嵌套類是不是真的需要。然而,你可以說,如果兩個類只能一起使用 - 比如A類使用助手類B,而B從不獨立使用 - 那麼靜態嵌套類就是要走的路。換句話說,通過讓B僅僅是一個普通的老班級,那個絆倒它的程序員可能會嘗試使用它。如果B是一個靜態嵌套類,那麼它就更加清楚它具有與A有關的特殊用法。

2

這些不叫做內部類,而是「靜態嵌套類」。它們在外部類中聲明爲靜態,這意味着它們可以在沒有實例化外部類的情況下存在。它們實際上只是在另一個類中定義的普通類,以便使代碼更易於閱讀和更好地分組。

欲瞭解更多信息,請參閱Java's documentation

1

當內部類是static時,它與頂級類的差別非常小:它使用外部類類的方式類似於名稱空間,並且可以訪問其外部類的其他靜態成員,而無需指定類的名稱。在所有其他方面,它與頂級類相同:特別是,它可以從靜態上下文中實例化,也就是您在代碼示例中執行的方式。

非靜態內部類爲其外部類的實例添加隱式引用。這是什麼改變了實例化的規則 - 現在你需要一個外部類的實例來實例化一個內部類。

0

這實際上只是一種將兩個相關類一起定義在一個文件中的方法。要實例化你的動作班,你應該這樣做:

int x=1; 
int y=1; 
moves m = new StringMatrix.moves(x,y);