簡體   English   中英

私人決賽 vs 決賽私人

[英]Private Final vs Final Private

在互聯網上搜索了一些,但找不到簡單的答案。 我的問題集是在 Android 框架中使用 Java,但我相信這也只是標准的 Java 行為。 我了解finalprivate的定義,它們都用於變量訪問和修飾符。 當說明要求我將變量初始化為final private變量時,我正在學習一些代碼和教程。 以前沒有見過這個,我改為創建了一個private final變量。 后來,代碼要求我在構造函數中初始化該變量,這顯然對private final變量失敗,因為它是不可變的。 但是,當我將變量更改為final private時它並沒有失敗......這讓我感興趣。 有誰知道為什么會這樣?

感謝您的回復!

Java 語言規范,第8.3.1 字段修飾符,說:

 FieldModifier: (one of) Annotation public protected private static final transient volatile

如果兩個或多個(不同的)字段修飾符出現在一個字段聲明中,通常(盡管不是必需的)它們的出現順序與上面FieldModifier 產生式中所示順序一致

這意味着private final首選樣式,但它與final private完全相同。

后來,代碼要求我在構造函數中初始化該變量,這顯然對私有 final 變量失敗,因為它是不可變的。

標記為final成員可以在構造函數中初始化。 您可以創建一個參數化構造函數,該構造函數接受來自類外部的值,也可以直接使用聲明來初始化這些成員。 如果您稍后選擇並且數據類型是原始數據,則將這些成員標記為static因為它們對於類的所有實例都將保持不變。

但是,當我將變量更改為最終私有時它並沒有失敗......這讓我感興趣

這是不可能的,因為private finalfinal private幾乎是一回事,不會有任何區別。 然而,前者被認為是良好的做法。 您可以按照此SO了解有關訂購的更多詳細信息。

舉個例子,這里有一些可以使用final和不可以使用的情況。 private finalfinal private之間沒有區別。 添加@Sagar 所說的內容,您可以內聯或在構造函數中初始化變量,但不能同時初始化。

public class TestClass {

    private final String i1;
    final private String i2;
    private final String i3 = "test"; // ok
    private final String i4; // not ok, never initialized

    TestClass() {
        i1 = "test1"; // ok
        i2 = "test2"; // ok
        i3 = "test3"; // not ok, overrides already set value
    }

    void mod() {
        i1 = "test0"; // not ok, can't edit final i1
    }
}

private finalfinal private沒有區別。 對於訪問修飾符,順序無關緊要。 所以他們都會有類似的行為。

嘗試這個:

public class Test {

    private final String privateFinal;
    final private String finalPrivate;

    public Test() {
        privateFinal = "Private Final";
        finalPrivate = "Final Private";
    }
}

上面的代碼編譯得很好。

它們是一樣的。 私人決賽 > 最終私人

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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