为什么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();
}
}
答案 0 :(得分: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)
这是因为最终变量无法在方法中初始化。它需要在构造函数中初始化,而仅在声明时或仅在静态块中初始化。