You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 15:32:08