2013-08-19 142 views
-1

我有一個靜態變量,並在類中更新它的值。但是當我從另一個類訪問這個變量時,它顯示了未更新的值。java - 訪問從另一個類增加的靜態變量

CLASS A

public static int postID = 1; 

    public static String Creator() 
    { 
    String message = "POST id="+postID; 
    return message; 
    } 

    void updatePostID() 
    { 
     postID++; //this function is being called each 10 seconds 
    } 

    @Override 
    public void start() { 
    handler.post(show); 
    } 

    Handler handler = new Handler(); 
    private final Runnable show = new Runnable(){ 
    public void run(){ 
     ... 
       updatePostID(); 
       handler.postDelayed(this, 10000);  
    } 
    }; 

CLASS B

String message = A.Creator(); //this always prints postID as 1 all time 

我需要,我可以從每一類訪問和更新其值的全局變量。等待您的幫助(我正在使用Android服務)

+0

功能工作()? –

+0

這甚至不是有效的java語法 – Kon

+0

函數work()是什麼?這甚至不是有效的輸入?! –

回答

2

這是一個經過測試的代碼。

public class A { 

    public static int id = 0; 

    public static int increment(){ 
     return A.id++; 
    } 

} 

public class B { 

    public static void main(String[] args) { 
     for (int i = 0; i < 5; i++) { 
      System.out.println(A.increment()); 
     } 

    } 
} 
+0

這不會更新A級中的ID值 – dracula

+0

@dracula:是的。你確定你已經完全複製了這些代碼嗎? –

+0

更新了我的問題,你可以看看 – dracula

1

需要調用工作,完成id++;

class B { 

    public static void main(String... args){ 

     A a = new A(); 
     a.work(); // You need to call it to apply add operation 

     System.out.println(A.id); // Prints 1 

    } 

} 

這是一個簡單的A類:

class A { 

    static int id = 0; 

    public void work(){ 

     id++; 

    } 
} 
在文件

保存類命名A.java和B類在名爲B.java的文件中。

然後編譯B.由於B創建一個類的實例,A將被編譯,你不需要編譯separately-

的javac B.java

編譯後,以執行/遊程

的java乙

+0

@dracula查看我的更新回答。 –

0

Sajal Dutta的答案完美地解釋了它,但是如果你想保持它的所有靜態(即不能創建類A的任何對象,你可以稍微修改代碼以這樣的:

class A { 
    static int id = 0; 
    public static void work(){ 
     id++; 
    } 
} 

然後:

class B { 
    public static void main(String[] args){ 
     System.out.println(A.id); 
     A.work(); 
     System.out.println(A.id); 
    } 
} 

這將產生:

編輯(關於你更新的問題)

你在哪裏指定更新了static int?從您提供的代碼中,您將要做的所有操作都是一遍又一遍地打印出相同的int,因爲永遠不會調用包含增量過程的方法。

編輯2:

嘗試這種情況:

變化:

handler.post(show); 

到:

handler.postDelayed(show, 10000); 
+0

正如我在評論中寫的,我用每10秒運行一次的處理程序調用updatePostID()。 – dracula

+0

@dracula:那代碼在哪裏? –

+0

它處於可運行的外觀代碼中。 – dracula

1

類A { 靜態INT ID = 0;

//I am updating id in my function , 
{ 
    id++; 
} 
} 

公共類起點{

public static void main(String... args){ 

    A a = new A(); 
    A b = new A(); 

    System.out.println(A.id); 
    System.out.println(a.id); 
} 

}

+0

我認爲您需要檢查您的代碼。這不會做你打算做的事情 - 爲什麼你要創建兩個A類對象,然後靜態引用它(並且靜態塊太可怕了!把它放在一個方法中)。 –

+0

只是一個反例,它會在每次創建新實例時增加值 – Nick

+0

儘管如此,你還沒有解釋。此外,當不使用對象並且靜態地訪問int時,通過創建類的新對象來增加int是非常不直觀的。 –