2012-01-02 29 views
1

由於靜態字段對象是在類級別創建的(並且對所有對象都通用),它是靜態導入特定字段還是繼承(使用實現),所有字段都會創建相同數量的內存?如何繼承靜態字段會影響性能?

例如在下面的propgram中創建了多少個MyOwn對象?

class MyOwn{} 

public interface ConstantIfc { 
    public final static MyOwn REF = new MyOwn(); 
} 

class A implements ConstantIfc {} 
class B implements ConstantIfc {} 

public class c { 
    public static void main(String... arg) { 
     A refA = new A(); 
     B refB = new B(); 
    } 
} 

如果相同,靜態導入的最終常量類如何比常量接口好?

更新:
我明白,最好避免常量的遺傳。不適當地利用實現繼承往往會導致設計不靈活。所以我們最好去靜態導入類/接口。但仍然接口是抽象的,爲了保持抽象,它們不應該包含實現細節(包括常量變量)。接口也經常用於描述公共API,其中實現細節不屬於。出於這個原因,將常量數據放入類而不是接口是有意義的。感謝robjb。

+2

我相信只有一個實例被創建(對於每個類加載器)。 – 2012-01-02 05:57:41

回答

1

在您給出的示例中,只有一個MyOwn對象被創建。它是在您的程序第一次加載ConstantIfc界面時創建的。

即使您使用靜態導入,答案仍然是相同的。靜態導入不應該在性能上比常量在接口中更好。他們被引入到語言中,以避免接口,他們所做的只是將常量定義爲從未用作接口(沒有變量與它們鍵入),從而導致混淆。

+0

非常感謝!但我仍然無法理解爲什麼只有常量的Ineterface是不允許的。它有什麼問題?請解釋一下。或者給一些鏈接請。 – 2012-01-02 07:05:40

+0

這不是他們不允許的。他們只是氣餒。更多細節可以在這裏找到:http://en.wikipedia.org/wiki/Constant_interface – 2012-01-02 16:20:51

1

爲MyOwn實現默認構造函數,讓它執行println()併爲自己計數。

+0

它只創建一次。因此對於特定字段的靜態導入或通過實現常量接口繼承所有常量;兩者會創建相同的內存? – 2012-01-02 06:52:20

+0

@Kanagavelu Sugumar:試試這個: – 2012-01-02 07:09:19

+0

@Hannes R「試試這個」是無法訪問的。 – 2012-01-02 07:17:16