[英]Cannot assign a value to final variable 'name'
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();
}
}
您只能在4個地方為最終成員變量賦值:
在申報時
在構造函數中
在靜態初始化塊中(如果變量為靜態)
在初始化塊中(如果變量不是靜態的)
這是常識。 您只能初始化一次最終變量。
構造函數只能被調用一次,因此,除非變量是靜態的,否則可以在此處對其進行初始化。
但是您的方法可以無限次調用,這將導致重新引用變量,這正是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());
}
}
您可以在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 ;
}
}
這是因為最終變量無法在方法中初始化。 它需要在構造函數中初始化,而僅聲明或僅在靜態塊中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.