私人决赛vs决赛私人

时间:2018-06-27 00:58:06

标签: java android

在互联网上进行了一些搜索,却找不到简单的答案。我的问题所在是在Android Framework中使用Java,但我相信这也是标准的Java行为。我了解finalprivate的定义,它们都用于变量访问和修饰符。当说明要求我将变量初始化为final private变量时,我正在遵循一些代码和教程。以前没有见过,我做了一个private final变量。后来,代码要求我在构造函数中初始化变量,显然它对private final变量是不可变的,因此失败了。但是,当我将变量更改为final private ...时,它并没有失败,这引起了我的兴趣。有谁知道为什么会这样?

感谢您的回复!

5 个答案:

答案 0 :(得分:14)

Java语言规范的第8.3.1. Field Modifiers部分说:

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

如果两个或多个(不同的)字段修饰符出现在字段声明中,这是习惯,尽管不是必需,但它们以顺序一致与上面显示的内容在FieldModifier的产品中。

这意味着private final首选样式,但与final private完全相同。

答案 1 :(得分:2)

  

稍后,代码要求我在   构造函数,显然无法对私有最终变量执行以下操作:   它是不可变的。

标记为final的成员可以在构造函数中初始化。您可以创建一个接受参数的构造函数,该构造函数从类外部接受值,或者直接使用声明直接初始化这些成员。如果您稍后选择并且数据类型为原始数据,则将这些成员标记为static,因为对于类的所有实例它们将保持相同。

  

但是,当我将变量更改为最终变量时,它并没有失败   私人...这让我很感兴趣

这是不可能的,因为private finalfinal private几乎是同一件事,不会有任何区别。但是,前者被认为是一种很好的做法。您可以按照此SO来获取有关订购的更多详细信息。

答案 2 :(得分:2)

作为一个例子,以下是一些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
    }
}

答案 3 :(得分:1)

private finalfinal private没有区别。对于访问修饰符,顺序无关紧要。因此,它们的行为将相似。

尝试一下:

public class Test {

    private final String privateFinal;
    final private String finalPrivate;

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

上面的代码完全可以编译。

答案 4 :(得分:0)

他们是同一回事。 私人最终>最终​​私人