Java中能否通过Scanner为static final常量赋值?
能否通过Scanner为Java常量赋值?
你给出的示例代码不可行,直接在普通代码中给static final常量赋值会触发编译错误。
原因:
Java中用final修饰的变量(常量)有严格的初始化规则:
- 静态
final常量(带static final)必须在类加载阶段完成初始化,要么在声明时直接赋值,要么在静态初始化块中赋值。 - 实例
final常量(仅final)则要在声明时或构造器中完成初始化。
你的示例里,dolarInReal是静态final常量,却在类加载完成后的普通代码中尝试赋值,这违反了Java对final变量的初始化要求,编译器会提示"可能尚未初始化变量dolarInReal"的错误。
正确实现方式
如果要通过Scanner给静态final常量赋值,可以把赋值逻辑放在静态初始化块中,示例代码如下:
import java.util.Scanner; public class CurrencyDemo { public static final double dolarInReal; // 静态初始化块,类加载时执行 static { Scanner sc = new Scanner(System.in); System.out.print("请输入美元兑换雷亚尔的汇率:"); dolarInReal = sc.nextDouble(); sc.close(); } public static void main(String[] args) { System.out.println("当前汇率:1美元 = " + dolarInReal + "雷亚尔"); } }
这段代码是可行的:静态初始化块在类加载时执行,此时完成dolarInReal的赋值,符合final常量的初始化规则,赋值后该常量的值就无法再修改。
内容的提问来源于stack exchange,提问作者Arthur Godoy
相关产品推荐
相关产品推荐

