簡體   English   中英

如果它是最終的那么為什么要放靜電?

[英]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 finalfinal

我講的非常廣泛,但如果它是最終的,你只需要它的一個實例,所以它通過使其靜態來節省內存。

更具體地說, 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM