当前位置: 首页 > news >正文

Java 基础知识整理:字面量、常量与变量的区别

在 Java 程序设计中,理解 字面量(literal)变量(variable)常量(constant) 的区别,以及字面量的默认类型和后缀规则,是掌握数据类型使用的基础。


1. 基本概念与默认规则

  • 字面量(Literal)

    字面量是源代码中直接写出的固定值
    常见示例如下:

    • 123(整数字面量,默认类型 int
    • 3.14(浮点字面量,默认类型 double
    • 'A'(字符字面量,类型 char
    • "hello"(字符串字面量,类型 String
    • true / false(布尔字面量,类型 boolean
    • null(空引用字面量,可赋给任意引用类型)

    编译器在解析字面量时会自动确定其默认类型。

  • 变量(Variable)

    变量是程序运行时的命名存储单元。它有明确的类型和作用域,值可以改变(除非使用 final 修饰)。
    常见形式包括:

    • 局部变量(local variable)
    • 实例字段(instance field)
    • 静态字段(static field)
  • 常量(Constant)

    在 Java 中,常量一般通过 finalstatic final 定义。根据初始化方式,可以分为两类:

    1. 编译期常量(compile-time constant)

      • static final 修饰
      • 基本类型或 String
      • 初始化表达式在编译阶段即可确定
      • 编译器会进行常量折叠优化
      • 例如:static final int SIZE = 10;
    2. 运行时常量(runtime constant)

      • 使用 final 修饰

      • 值在运行时计算,赋值后不可再更改,但并非编译期常量

      • 例如:

        final int VALUE = new Random().nextInt(100);
        

2. 字面量后缀的必要性

  • 浮点字面量与 f/F

    • 原因:Java 默认将小数字面量解析为 double(64 位)。若直接赋给 float(32 位),属于缩小转换(narrowing conversion),编译器不允许隐式执行,以避免精度丢失。

    • 解决方案

      • 显式加后缀:3.14f
      • 或强制类型转换:float f = (float) 3.14;
    • 建议:一般优先使用 double;在内存敏感或与底层接口兼容时,再使用 float

  • 整数字面量与 L

    • 原因:整数字面量默认是 int(32 位,范围约 ±2.1×10^9)。当超出 int 范围时,必须显式标注为 long

    • 示例

      long l1 = 1000;         // 在 int 范围内,可直接赋值
      long l2 = 3000000000L;  // 超出 int,必须加 L
      
    • 建议:始终使用大写 L,避免与数字 1 混淆。

3. byteshort 的特殊情况

  • 整数字面量默认是 int,但若数值在 byte(-128~127)或 short(-32768~32767)的取值范围内,且是编译期常量,编译器会允许隐式赋值:

    byte b = 100;    // OK,编译器检查到范围内
    short s = 20000; // OK
    
  • 若赋值来源是变量(运行时才确定),则需要强制转换:

    int x = 100;
    // byte b = x;   // 编译错误
    byte b = (byte) x; // 必须显式强转
    

原因:编译器只对编译期常量进行范围折叠与校验,运行时变量则不做推断。

4. 常见错误与建议

  • 错误示例

    • float f = 3.14; → 应写作 3.14f(float) 3.14
    • long l = 3000000000; → 应写作 3000000000L
  • 建议

    • 浮点计算优先使用 double
    • 仅在内存或接口要求时使用 float
    • 整数字面量超出 int 时显式加 L,并推荐大写 L
    • 可使用下划线增强可读性:3_000_000_000L

5. 总结

  1. 字面量有默认类型:整数 → int;小数 → double
  2. floatlong 需要通过后缀 f / L 明确指定。
  3. byteshort 在编译期常量范围内可直接赋值;运行时变量赋值需强制转换。
  4. final 表示变量不可重新赋值,但并不等同于“对象不可变”。

通过正确理解字面量的默认规则和后缀机制,可以避免常见的编译错误,并编写出更清晰、安全的 Java 代码。

http://www.dtcms.com/a/389434.html

相关文章:

  • 模型部署:(六)安卓端部署Yolov8分类项目全流程记录
  • android 查看apk签名信息
  • SQL提取国家名称与延伸词技巧
  • 通过 商业智能 BI 数据分析提升客流量和销售额
  • PostgreSQL 与 MySQL 谁的地位更高?——全方位对比分析
  • rust编写web服务08-配置管理与日志
  • 浏览器事件机制里,事件冒泡和事件捕获的具体区别是什么?在React的合成事件体系下有什么不同的?
  • 企业级实战:构建基于Qt、C++与YOLOv8的模块化工业视觉检测系统(基于QML)
  • 【Java】Ubuntu上发布Springboot 网站
  • 【入门级-算法-3、基础算法:贪心法】
  • Linux 网络
  • 【LVS入门宝典】探秘LVS透明性:客户端如何“看不见”后端服务器的魔法
  • 23届考研-C++面经(OD)
  • 运维安全06,服务安全
  • C++篇(9)list的模拟实现
  • Bugku-宽带信息泄露
  • LeetCode 845.数组中的最长山脉
  • 分布式存储与NFS:现代架构选型指南
  • SpringBoot三级缓存如何解决循环依赖的问题
  • 火山引擎 veCLI 发布,开启智能开发新模式
  • UE学习记录11----地形数据获取等高线
  • 【C++】STL--priority_queue(优先级队列)使用及其模拟实现、容器适配器和deque(双端队列)了解
  • 数学差能学人工智能吗?
  • Verilog语法学习EP10:串口接收模块
  • 使用obs同步录制窗口的高质量游戏模式视频
  • Qt语言家的简单使用记录
  • Taro + vue3项目,如何生成安卓 apk 安装包
  • Hive HQL命令
  • 智慧医疗新纪元:快瞳科技如何用OCR技术重塑医疗单据处理体验
  • 4.1软件工程管理-CMM2软件项目规划-思考题