在互联网上进行了一些搜索,却找不到简单的答案。我的问题所在是在Android Framework中使用Java,但我相信这也是标准的Java行为。我了解final
和private
的定义,它们都用于变量访问和修饰符。当说明要求我将变量初始化为final private
变量时,我正在遵循一些代码和教程。以前没有见过,我做了一个private final
变量。后来,代码要求我在构造函数中初始化变量,显然它对private final
变量是不可变的,因此失败了。但是,当我将变量更改为final private
...时,它并没有失败,这引起了我的兴趣。有谁知道为什么会这样?
感谢您的回复!
答案 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 final
和final private
几乎是同一件事,不会有任何区别。但是,前者被认为是一种很好的做法。您可以按照此SO来获取有关订购的更多详细信息。
答案 2 :(得分:2)
作为一个例子,以下是一些final
可以解决的问题。 private final
和final 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 final
和final private
没有区别。对于访问修饰符,顺序无关紧要。因此,它们的行为将相似。
尝试一下:
public class Test {
private final String privateFinal;
final private String finalPrivate;
public Test() {
privateFinal = "Private Final";
finalPrivate = "Final Private";
}
}
上面的代码完全可以编译。
答案 4 :(得分:0)
他们是同一回事。 私人最终>最终私人