Java 无法为最终变量“name”赋值
为什么Java不允许我间接初始化最终变量?我不明白为什么它不应该工作,我的意思是该方法将始终运行,所以如果直接初始化或通过该方法初始化,会有什么区别 此代码适用于:Java 无法为最终变量“name”赋值,java,intellij-idea,Java,Intellij Idea,为什么Java不允许我间接初始化最终变量?我不明白为什么它不应该工作,我的意思是该方法将始终运行,所以如果直接初始化或通过该方法初始化,会有什么区别 此代码适用于: package com.company; public class Person { private final String name; public Person() { name = "bob"; } } 这个没有。即使我去掉了IO代码,并对分配给name的值进行了硬编码 pac
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();
}
}
只能在4个位置为最终成员变量赋值: 在申报时 在构造函数中 在静态初始化块中,如果变量是静态的 在初始化块中,如果变量不是静态的
只能在4个位置为最终成员变量赋值: 在申报时 在构造函数中 在静态初始化块中,如果变量是静态的 在初始化块中,如果变量不是静态的
您可以在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个位置初始化最终变量 带声明 仅在构造函数中是非静态的 在静态初始值设定项中,仅用于静态 实例中仅初始值设定项为非静态 静态最终变量 这些变量可以在声明或静态初始值设定项中初始化
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 ;
}
}
这是因为最终变量不能在方法中初始化。它需要在构造函数中初始化,而只声明或只在静态块中初始化。这是因为最终变量不能在方法中初始化。它需要在构造函数中初始化,同时只声明或只在静态块中声明。这是常识。只能初始化最终变量一次 构造函数只能调用一次,因此,除非变量是静态的,否则可以在这里初始化它
但是您的方法可以被无限次调用,这将导致变量被重新引用,这正是final关键字应该避免的情况。这是常识。只能初始化最终变量一次 构造函数只能调用一次,因此,除非变量是静态的,否则可以在这里初始化它 但是您的方法可以被无限次调用,这将导致变量被重新引用,这正是final关键字应该避免的情况。必须在构造函数中设置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());
}
}
必须在构造函数中设置最终字段。你可以做以下几点
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());
}
}
最终手段,你不能分配给它,除非在构造函数中或在声明点。可能重复的最终手段,你不能分配给它,除非在构造函数中或在声明点。可能的重复实际上是有意义的。如果能够将构造函数中的长代码段封装到函数中会很好,但这是函数的唯一目的。这实际上是有意义的。能够将构造函数中的长代码段封装到函数中会很好,但这是函数的唯一目的。