Java 私人决赛vs私人决赛
在国际互联网上搜索了几次,却找不到一个简单的答案。我的问题集是在Android框架中使用Java,但我相信这也是标准的Java行为。我理解Java 私人决赛vs私人决赛,java,android,Java,Android,在国际互联网上搜索了几次,却找不到一个简单的答案。我的问题集是在Android框架中使用Java,但我相信这也是标准的Java行为。我理解final和private的定义,它们都用于变量访问和修饰符。当指令要求我将变量初始化为final private变量时,我正在遵循一些代码和教程。我以前没有看到过这一点,而是创建了一个private final变量。后来,代码要求我在构造函数中初始化变量,这显然对private final变量失败,因为它是不可变的。但是,当我将变量更改为final priv
final
和private
的定义,它们都用于变量访问和修饰符。当指令要求我将变量初始化为final private
变量时,我正在遵循一些代码和教程。我以前没有看到过这一点,而是创建了一个private final
变量。后来,代码要求我在构造函数中初始化变量,这显然对private final
变量失败,因为它是不可变的。但是,当我将变量更改为final private
时,它并没有失败。。。这让我很感兴趣。有人知道为什么会这样吗
谢谢你的回复
后来,代码要求我在
构造函数,它显然对私有final变量失败
它是不变的
标记为final
的成员可以在构造函数中初始化。您可以创建一个prameterized构造函数,该构造函数接受来自类外部的值,或者直接使用声明初始化这些成员。如果选择“以后”,且数据类型为基本类型,则将这些成员标记为“静态”,因为它们对于类的所有实例都将保持不变
然而,当我将变量更改为final时,它并没有失败
私有的这让我很感兴趣
这是不可能的,因为
private final
和final private
实际上是同一件事,不会有任何区别。然而,前者被视为良好实践。有关订购的更多详细信息,您可以按照此操作。作为示例,以下是一些关于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
}
}
Java语言规范第节说: 如果一个字段声明中出现两个或多个(不同的)字段修饰符,则它们的出现顺序与FieldModifier生产中的上述顺序一致,这是习惯性的,尽管不是必需的
这意味着
private final
是首选样式,但它与final private
完全相同private final
和final private
没有区别。对于访问修饰符,顺序无关紧要。所以他们两个都会有相似的行为
试试这个:
public class Test {
private final String privateFinal;
final private String finalPrivate;
public Test() {
privateFinal = "Private Final";
finalPrivate = "Final Private";
}
}
上面的代码编译得非常好。它们是一样的。
private final>final private您可以在构造函数中分配final未声明的字段。请举例说明
final private
和private final
是同一件事。顺序不重要。我不同意答案的静态部分。例如,您可以声明final List objs=new ArrayList()
,这可以防止字段每次引用不同的列表,但列表本身并不是不可变的,因此每个实例可以具有不同内容的不同列表,因此static
是不正确的。“否决投票,直到答案的这一部分被删除,因为这是误导性的。”安德烈亚斯谢谢你的强调。更新了我的答案。我错过了这一点老实说,这是我一直认为的情况。我正在使用IntelliJ/Android Studio,出于某种原因,解释器在我编译它之前大声喊叫,说我无法尝试我试图做的事情。出于某种原因,它不再这么说了,所以我真的不知道发生了什么,但不管怎样,我真的很感激它的清晰,以防其他人也有同样的问题@ShoeShiner大多数静态分析器、样式检查器等都会将与JLS中指定顺序的偏差标记为问题-也许您看到了这些提示之一?
public class Test {
private final String privateFinal;
final private String finalPrivate;
public Test() {
privateFinal = "Private Final";
finalPrivate = "Final Private";
}
}