2016-03-04 119 views
-4

我有點麻煩了解下面的代碼的輸出。有人可以解釋確切的步驟,以便我可以更好地瞭解發生了什麼?有人可以請解釋輸出java

public class Foo { 
    private static int id = 0 ; 
    private int myId ; 

    public Foo() { 
     myId = id ; 
     ++id ; 
    } 

    public int getMyId() { 
     return myId ; 
    } 

    public static void main(String[] args) { 
     Foo f1 = new Foo(); 
     Foo f2 = new Foo(); 
     System.out.println(f1.getMyId()); 
     System.out.println(f2.getMyId()); 
     System.out.println(id); 
    } 
} 

你能解釋一下爲什麼輸出等於:

0 
1 
2 
+4

你有沒有試過走通路你自己呢?如果是這樣,哪個確切的部分是你感到困惑? – resueman

+1

你可以請[編輯]你的問題,並修復你的代碼的indetion?這是非常難以閱讀。 – 2016-03-04 14:47:39

回答

1
  1. 創建F1,身份識別碼= 0,因爲ID = 0
  2. 在構造函數中,我們用1
  3. 遞增ID
  4. 創建F2,myId = 1,因爲我們只是增加了id。
  5. 在構造函數中,我們再次將id加1。
  6. 打印MYID的從F1的值仍爲0
  7. 打印MYID從F2這仍然是1。
  8. 打印ID是靜態的,因此實例之間共享的值的值。它是2在最後一個增量之後。

我假設你發現靜態部分容易混淆,在這種情況下這個變量被有效地保留一次。使用10個Foo實例時,仍然只有1個「靜態」ID(每次創建Foo的新實例時都會增加)。

0

Class Foo有一個名爲id private static int id的靜態字段,每當該類的一個實例調用public int getMyId(){....}這個示例時,它就會增加,在這個示例中,您曾經看到它想要區分object('instance')和class所以當你有2個對象foo1和foo2並且它們都調用公共方法getMyId時,靜態變量會被獨立於對象調用foo1或foo2而遞增,另一方面,這兩個對象foo1和foo2都可以看到id變量id是一個非靜態的字段,因此它是對象的「屬性」,因此對象foo1的id對對象foo2不可見,反之亦然。

所以上課的時候第一次創建靜態字段「身份證」得到的值0

則呼叫foo1.getMyId進行實地身份識別碼具有存儲在ID的值是0,那麼增加的ID,這樣的ID現在已經價值1

通話foo2.getMyId()將會把價值ID至極是在身份識別碼1,增加ID現在ID具有值2的返回值身份識別碼

呼叫ID爲喜歡稱之爲Foo.id所以會給你的身份證號碼是2