2011-10-19 52 views
1

我有一個類Car它有一個類作用域變量成本,我明白,這是一個壞主意在實踐中,只是試圖瞭解公共範圍類變量的影響。可以存在兩個類變量副本嗎?

將成本由Car.cost級轎車,引用的所有對象訪問和修改,在所有的類加載器,或者我應該知道的,其中可能存在的Car.cost多個副本的情況?在任何情況下只會有一個Car.cost

public class Car{ 
    public static int cost; 

    public Car(int cost){ 
    cost = cost; 
    } 
} 

public static void main(String args[]){ 
    Car car = new Car(2);  
} 
+1

這可能會感興趣:http://stackoverflow.com/questions/5950025/multiple-instances-of-static-variables的 – NPE

+0

可能重複[是可能有多個靜態變量實例](http://stackoverflow.com/questions/3349797/is-it-possible-to-have-multiple-instances-of-static-variables) – NPE

回答

1

通過指定cost場爲static你說會有永遠只能是變量的一個共享實例,而不管有多少汽車類創建(過程中)。是的,任何實例將能夠修改該單一的共享字段,並且自從您公開該字段之後,其他客戶端代碼也可以訪問Car類。 (其他可能使用相同類的進程將擁有其自己的靜態類成員副本,並且將無法在整個進程邊界「看到」。)

從語義上講,如果我推斷Car的含義和成本正確地說,你不想使用靜態,除非你想要所有的車都花費相同。在現實世界中,即使在相同車型的相同型號的車輛上,由於修剪,選項等,車輛的成本也是高度可變的屬性。

3

構造函數中的本地範圍成本(參數)隱藏了類範圍成本(靜態)。 更改構造是這樣的:

public Car(int cost) 
{ 
    Car.cost = cost; 
} 

不要this.cost解決類範圍變量(靜態費用)。而應使用類名稱靜態地進行編址。

編輯:這是一個簡單的例子:

public final class CostTest 
{ 
    private static int cost; 

    public static void main(String[] args) 
    { 
     CostTest costTest; 

     System.out.print("initial static cost value: "); 
     System.out.println(CostTest.cost); 

     costTest = new CostTest(17); 

     System.out.print("static cost value: "); 
     System.out.println(CostTest.cost); 

     System.out.print("static cost value via instance variable: "); 
     System.out.println(costTest.cost); 
    } 

    public CostTest(int cost) 
    { 
     CostTest.cost = cost; 
    } 
} 

當你把這個ecliipse,你應該看到,說就行了System.out.println(costTest.cost);警告像「靜磁場CostTest.cost應該訪問一種靜態的方式「。

6

每個加載的類將只有一個靜態cost變量實例。但請注意,根據類加載器,類可能會多次加載。

一點題外話,這不會做你認爲:

public Car(int cost) 
{ 
    cost = cost; 
} 

在這裏,你的參數,而不是參數分配給自己(如果你把它最後你應該得到一個編譯器錯誤)到靜態變量。這也叫做陰影和不好的做法。

0

多個Car.cost變量在這裏CAN NOT存在,因爲Car.cost可以從類路徑中加載的每個類訪問(因爲它在同一時間是公共和靜態的)。

當OO語言中的某些內容是「public static」時,這意味着它可以被視爲過程語言中的全局變量。這幾乎是一樣的。

所以,綜上所述,Car.cost變量的情況下僅僅是在程序的生命週期。

祝你好運!

1

這裏唯一的摺痕是如果涉及多個ClassLoaders。在這種情況下,在每個ClassLoader的上下文中可以存在給定類的實例,然後它將具有與其關聯的單獨的一組靜態字段。大多數(如果不是全部的話)Servlet & J2EE容器使用多個ClassLoaders,通常每個web-app一個。

ClassLoaders通常是分層結構,這樣您就可以訪問父類加載的類ClassLoader。通過這種方式,如果您確實需要跨多個Web應用程序的全局單身人士,您通常會嘗試將您的單身人士加載到根目錄ClassLoader中,以便隨處訪問它。

退房這說明了一個例子:http://vanillajava.blogspot.com/2011/07/java-secret-loading-and-unloading.html

相關問題