[英]Where to put a interface related variable that it is not static and final
[英]If it is final then why put static?
有時我看到類似的東西:
public class MainActivity extends Activity
{
public static final String url_google = "http://www.google.com";
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}
我實際上沒有得到的,是為什么使用public static final
,而不是public final
或final
我講的非常廣泛,但如果它是最終的,你只需要它的一個實例,所以它通過使其靜態來節省內存。
更具體地說, final
關鍵字意味着無論變量存儲是什么都無法更改。 這意味着一旦變量具有值,您可以使用該變量,但不能以任何方式對其進行修改。 通常,要為最終變量賦值,可以直接從聲明中執行,例如final int variable = 12
。 正如您所看到的,我在示例中使用了int,但您可以使用任何內容,包括引用變量。 引用變量雖然很特殊,但因為您無法更改變量指向的內容,但您可以更改Object本身(例如使用get / set方法)。
然而,歸結為,一旦你制作了一個最終變量,它就占據了內存中的空間。 由於我們無法進一步修改此變量,為什么每次我們的Class實例化時都要重新創建它? 所以我們使用static
關鍵字。 這允許變量創建一次,並且只在內存中創建一次。
但是,在某些特定情況下,您不希望使用static
並僅使用final。 一個示例可以是時間敏感變量,例如存儲對象實例化的時間。
static
表示只會創建一個url_google
。 如果它是一個實例字段(非靜態),則會為每個活動實例創建一個新的url_google
,而您實際需要的只是url_google
一個副本。
Java final
關鍵字非常松散地用於表示某些內容“無法更改”。
它與static
關鍵字無關,它表示它是一個“類變量”,意味着所有實例共享同一個變量副本。 可以使用類直接訪問類變量,而無需創建實例。
它們具有不同的含義,可以一起使用或單獨使用。
我認為A - C的答案是誤導性的:“我的講話非常廣泛,但如果它是最終的,那么你只需要它的一個實例,所以它通過使它保持靜態來節省內存。” 正如其他人指出的那樣,他將靜態和最終混合在一起,這是兩個非常不同的東西。 它並沒有廣泛地說恕我直言,但不夠精確,尤其是在解釋基本概念時。
靜態變量與類相關聯,而不是與任何對象相關聯。 該類的每個實例共享一個類變量,該變量位於內存中的一個固定位置。 任何對象都可以更改類變量的值,但也可以在不創建類實例的情況下操作類變量。
另一方面的最終變量是只能初始化一次的變量。 它們的值不必在編譯時知道,但可以在運行時設置。 如果最終變量是實例變量,則此變量可以有許多實例,所有實例都具有不同的值。
靜態最終變量是一個常量,因為它只有一個,並且在初始化后不能在運行時更改。 在Java中,至少在編譯時不必知道該值。
現在這一切都是非常理論化的,所以讓我們舉一個例子來說明這些類型變量的用法:
public class Circle implements Serializable {
private static final long serialVersionUID = -1990742486979833728L;
private static int sNrOfCircles;
private final double mArea;
public Circle(double radius) {
sNrOfCircles++;
mArea = radius*radius*Math.PI;
}
}
serialVersionUID將版本號與反序列化期間使用的Circle類相關聯,以驗證發送方和接收方是否已為該對象加載了與序列化兼容的類。 serialVersionUID永遠不會更改,並且對於Circle的所有實例都是相同的。
sNrOfCircles計算Circle實例的數量。 它隨着Circle的每個新實例而變化(而serialVersionUID從未這樣做)。
mArea定義Circle的面積。 它也隨着Circle的每個實例而變化,但與sNrOfCircles相比,它與Circle對象相關聯而不是Circle類,並且當創建另一個Circle對象時sNrOfCircles將更改時,它也不能更改。
簡單來說:如果它是一個Class屬性(我們有多少個圓圈?),請使用static,如果初始化后值不會改變,則使用final(具有給定半徑的圓的面積),如果是,則使用static final都。
主要原因是您無需實際的類實例即可訪問該值。
在您的示例中,任何代碼都可以訪問url_google值,而無需MainActivity實例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.