Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/222.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 私人决赛vs私人决赛_Java_Android - Fatal编程技术网

Java 私人决赛vs私人决赛

Java 私人决赛vs私人决赛,java,android,Java,Android,在国际互联网上搜索了几次,却找不到一个简单的答案。我的问题集是在Android框架中使用Java,但我相信这也是标准的Java行为。我理解final和private的定义,它们都用于变量访问和修饰符。当指令要求我将变量初始化为final private变量时,我正在遵循一些代码和教程。我以前没有看到过这一点,而是创建了一个private final变量。后来,代码要求我在构造函数中初始化变量,这显然对private final变量失败,因为它是不可变的。但是,当我将变量更改为final priv

在国际互联网上搜索了几次,却找不到一个简单的答案。我的问题集是在Android框架中使用Java,但我相信这也是标准的Java行为。我理解
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";
    }
}