无法为最终变量“名称”分配值

时间:2018-10-03 13:35:46

标签: java intellij-idea

为什么Java不允许我间接初始化最终变量?我不明白为什么它不起作用,我的意思是该方法将始终运行,因此,如果直接或通过方法进行初始化,会有什么不同?

此代码有效:

package com.company;

public class Person {

    private final String name;

    public Person() {
        name = "bob";
    }
}

这不是。 (即使我摆脱了IO代码并硬编码分配给name的值)

package com.company;

import java.util.Scanner;

public class Person {

    private final String name;

    public Person() {
        askName();
    }

    public void askName() {
        Scanner scanner = new Scanner(System.in);
        name = scanner.nextLine();
    }
}

5 个答案:

答案 0 :(得分:3)

您只能在4个地方为最终成员变量赋值:

  1. 在声明时

  2. 在构造函数中

  3. 在静态初始化块中(如果变量为静态)

  4. 在初始化块中(如果变量不是静态的)

答案 1 :(得分:3)

这是常识。您只能一次初始化一个最终变量。

构造函数只能被调用一次,因此,除非变量是静态的,否则可以在此处对其进行初始化。

但是您的方法可以无限次调用,这将导致重新引用变量,这正是final关键字应避免发生的情况。

答案 2 :(得分:3)

final字段必须在构造函数中设置。您可以执行以下操作。

import java.util.Scanner;

public class Person {

    private final String name;

    public Person() {
        name = askName();
    }

    public static String askName() {
        Scanner scanner = new Scanner(System.in);
        return scanner.nextLine();
    }
}

但是,更好的选择可能会注入您所需的值。

import java.util.Scanner;

public class Person {

    private final String name;

    public Person(String name) {
        this.name = name;
    }

    public static Person askName() {
        Scanner scanner = new Scanner(System.in);
        return new Person(scanner.nextLine());
    }
}

答案 3 :(得分:0)

您可以在4个地方初始化最终变量。

  • 带有声明
  • 在构造函数中(仅非静态)
  • 在静态初始值设定项中(仅适用于静态)
  • 在实例初始值设定项中(仅非静态)

静态最终变量

这些变量可以在声明或静态初始化程序中初始化。

class Program {
    static final int i1 = 10;
    static final int i2;
    static {
        i2 = 10;
    }
}

最终变量

最终变量可以在声明,实例初始化程序或构造函数中初始化:

class Program {
    final int i1 = 10;
    final int i2;
    final int i3;
    {
        i2 = 10;
    }

    Program() {
        i3 = 10;
    }
}

局部最终变量

这些变量可以在声明中或声明后的任何地方初始化。本地最终变量必须在使用之前进行初始化。

class Program {
    void method() {
         final int i1 = 10;
         final int i2;
         System.out.println(i1);
         i2 = 10;
         System.out.println(i2);
         return ;
    }
}

答案 4 :(得分:0)

这是因为最终变量无法在方法中初始化。它需要在构造函数中初始化,而仅在声明时或仅在静态块中初始化。