news 2026/5/8 13:19:01

final,static,const差异

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
final,static,const差异

做了这么多年的Java,一般也不想了解一些细枝末节的东西比如如题的这三个东西。面试的时候常常会问到,我才留了个心。最近在细看flutter的东西,看到这里边一个变量,居然用了final来修饰,果断问了下豆包,有了新的认知。

Future<void>_login()async{// 这里居然用了final来修饰一个变量,final不是不能修改的吗?finalMap<String,dynamic>data={"account":_phoneController.text,"password":_codeController.text,};try{finalresponse=awaitloginAPI(data);print(response);_userController.updateUserInfo(response);ToastUtils.showToast(context,"登录成功");Navigator.pop(context);}catch(e){ToastUtils.showToast(context,(easDioException).message??"登录异常");}}

问:这里可以用final修饰吗?
答:是的,这里可以使用final修饰。

分析

  • 可以使用final:在这个场景下使用final是合适的
  • 推荐使用final:因为这个 [data](file:///C:/GitHub/flutter_learn/lib/app/pages/login/index.dart#L207-L210) 变量在创建后不需要重新赋值
  • 性能优化final修饰符可以防止意外的重新赋值,提高代码安全性

详细说明

// 当前代码 - 已经使用了 final(正确)finalMap<String,dynamic>data={"account":_phoneController.text,"password":_codeController.text,};
  • [data](file://C:\GitHub\flutter_learn\build\app\intermediates\flutter\debug\flutter_assets\vm_snapshot_data) 变量在初始化后只用于传递给 [loginAPI](file:///C:/GitHub/flutter_learn/lib/app/api/user_api.dart#L4-L8) 函数
  • 没有对该变量进行重新赋值的需求
  • 使用final符合不可变性原则,使代码更加安全和可预测

因此,当前代码中使用final的做法是正确的


问:但是这个对象中的值会随着用户输入的改变而变化,为什么还能用final修饰?

答:

关于final修饰 Map 的说明

1.final与不可变性的理解

  • final修饰变量引用:防止变量指向其他对象
  • 不修饰对象内容:Map 内部的值仍可以修改
  • 当前场景适用:[data](file:///C:/GitHub/flutter_learn/lib/app/pages/login/index.dart#L207-L210) 只用于 API 调用,无需后续修改

2. Dart 中的可变 vs 不可变

// final 修饰引用,但 Map 内容可变finalMap<String,dynamic>data={"account":"123"};data["account"]="456";// ✅ 允许修改内容data={};// ❌ 不允许重新赋值// 如需完全不可变,使用:finalMap<String,dynamic>immutableData=Map.unmodifiable({"account":_phoneController.text,"password":_codeController.text,});

3. 当前代码的合理性

  • [data](file:///C:/GitHub/flutter_learn/lib/app/pages/login/index.dart#L207-L210) 作用域:仅在_login()方法内使用一次
  • 数据流向:从控制器获取 → 组装对象 → 传递给 API → 完成使命
  • 使用final正确:防止意外的变量重新赋值,保证引用不变

4. 总结

final修饰的是变量引用而非对象内容,因此即使用户输入变化,[data](file:///C:/GitHub/flutter_learn/lib/app/pages/login/index.dart#L207-L210) 在创建时捕获的值也不会影响final的使用合理性。


问:Java中的final也是类似的意思吗?

答:

Java 中的final与 Dart 中的final对比

1. 相似性

  • 引用不变性:都用于防止变量引用被重新赋值
  • 对象内容可变:修饰的容器对象内部元素仍可修改
  • 编译时检查:都会在编译阶段检查是否违反final规则

2. Dart 中的final

finalMap<String,String>data={"key":"value"};data["key"]="new value";// ✅ 允许data={};// ❌ 不允许

3. Java 中的final

finalMap<String,String>data=newHashMap<>();data.put("key","value");// ✅ 允许data=newHashMap<>();// ❌ 不允许

4. 关键差异

  • 初始化时机:Java 支持在构造器中初始化final字段
  • 语法细节:Java 中final可用于类、方法、变量多个层面
  • 性能优化:Java 的final在 JVM 优化中作用更显著

5. 总结

  • 两种语言的final概念基本一致
  • 都是引用级别的不可变性
  • 容器内容的可变性在两种语言中都存在

问:final和static的异同?

finalstatic的异同

相同点

  • 都用于修饰符:都是编程语言中的关键字
  • 限制性:都对被修饰的元素施加某种限制

不同点

final

  • 作用:修饰变量,表示不可变性
  • 生命周期:运行时检查,变量只能被赋值一次
  • 实例相关:通常用于实例变量或局部变量
  • Dart 示例
finalStringname="user";// name = "new"; // ❌ 编译错误

static

  • 作用:修饰成员,表示类级别而非实例级别
  • 内存分配:属于类本身,不依赖于实例
  • 访问方式:通过类名直接访问,无需实例化
  • Dart 示例
classMyClass{staticStringclassName="MyClass";staticvoidprintInfo(){print("This is$className");}}// 访问:MyClass.className 或 MyClass.printInfo()

结合使用

  • static final:最常见组合,用于定义常量
  • Dart 示例
staticfinalStringAPI_URL="https://api.example.com";

总结

  • final关注可变性static关注作用域
  • final限制赋值次数,static限制访问方式
  • 两者解决不同问题,可同时使用

问:static的访问方式有什么区别,应该是可变的吧?

static访问方式的区别

访问方式对比

1. 访问途径

  • 类名访问ClassName.staticMember
  • 实例访问instance.staticMember(不推荐,但仍可行)

2. Dart 中的访问示例

classMyClass{staticStringclassName="MyClass";staticvoidprintInfo(){print("Static method called");}}// 推荐方式MyClass.className;MyClass.printInfo();// 技术上可行但不推荐MyClassinstance=MyClass();instance.className;// 不推荐

可变性说明

1.static本身不保证不可变

  • 可变static var或未使用finalstatic变量
  • 不可变static finalstatic const

2. 示例对比

classConfig{// 可变的 static 变量staticStringapiUrl="https://api.example.com";// 不可变的 static 常量staticfinalStringAPP_NAME="MyApp";staticconstint VERSION=1;}// 可变 static 变量可以被修改Config.apiUrl="https://new-api.example.com";// ✅ 允许// 不可变 static 常量不能被修改// Config.APP_NAME = "NewName"; // ❌ 编译错误

3. 实际情况

  • static修饰的成员可以是可变的
  • 是否可变取决于是否使用finalconst修饰
  • static只表示作用域(类级别),不表示可变性

总结

  • static成员通过类名直接访问
  • static本身不保证不可变性
  • 可变性由final/const关键字控制

问:

static final String APP_NAME = “MyApp”;
static const int VERSION = 1;
这两个final和const有什么区别

答:

finalconst的区别

编译时 vs 运行时

  • const:编译时常量,在编译时确定值
  • final:运行时常量,在运行时首次赋值后不可变

内存分配差异

  • const:相同值的const对象共享内存,保证对象唯一性
  • final:每次创建新的对象实例,不保证唯一性

使用场景对比

static const

staticconstint VERSION=1;// 编译时已知的常量
  • 适用于编译时确定的常量值
  • 如数字、字符串字面量、布尔值等

static final

staticfinalStringAPP_NAME="MyApp";// 运行时确定的常量
  • 适用于运行时计算的常量值
  • 如通过函数计算得到的值

初始化时机

  • const:必须在声明时确定值
  • final:可以在运行时任何时间点赋值(但只能赋值一次)

性能差异

  • const:编译时优化,内存占用更优
  • final:运行时初始化,灵活性更高

实际应用

在你的示例中:

  • static const int VERSION = 1- 版本号是编译时常量
  • static final String APP_NAME = "MyApp"- 应用名通常也是编译时常量,可考虑改为const

以上是对final,static,const的认识,祝好~

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 1:02:57

GoldHEN作弊管理器:如何在PS4上轻松管理1490款游戏修改方案

GoldHEN作弊管理器&#xff1a;如何在PS4上轻松管理1490款游戏修改方案 【免费下载链接】GoldHEN_Cheat_Manager GoldHEN Cheats Manager 项目地址: https://gitcode.com/gh_mirrors/go/GoldHEN_Cheat_Manager 你是否曾经在PS4游戏中遇到难以逾越的挑战&#xff1f;或者…

作者头像 李华
网站建设 2026/5/5 15:01:40

Diablo II自动化革命:10分钟打造智能刷怪终极方案

还在为重复枯燥的刷怪过程而苦恼吗&#xff1f;想要在Diablo II中获得更高的游戏效率却苦于时间有限&#xff1f;今天我们将为您揭秘一套完整的Diablo II自动化解决方案——Botty智能脚本系统&#xff0c;让您轻松实现游戏自动化&#xff0c;重新定义暗黑破坏神的游戏体验&…

作者头像 李华
网站建设 2026/5/1 16:09:08

手机输入法语音播报:IndexTTS 2.0集成方案设想

手机输入法语音播报&#xff1a;IndexTTS 2.0集成方案设想 在如今的智能手机体验中&#xff0c;输入法早已不只是“打字工具”——它是我们与数字世界对话最频繁的入口。每一次按键、每一个表情符号的选择&#xff0c;背后都潜藏着对交互自然度的更高期待。而当用户按下空格确认…

作者头像 李华
网站建设 2026/5/1 8:21:20

Botty自动化助手:暗黑破坏神2重制版智能运行完全指南

Botty是一款专为《暗黑破坏神2重制版》设计的开源自动化工具&#xff0c;通过先进的图像识别技术模拟玩家操作&#xff0c;实现游戏内重复任务的智能化执行。无论你是新手玩家还是资深老鸟&#xff0c;这款工具都能帮你解放双手&#xff0c;让游戏体验更加轻松愉快。 【免费下载…

作者头像 李华
网站建设 2026/5/2 11:20:06

计算机毕设java汽车租赁系统设计与实现 基于Java技术的汽车租赁管理系统开发与实践 Java驱动的汽车租赁信息化平台设计与应用

计算机毕设java汽车租赁系统设计与实现6fiux9 &#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。随着经济的快速发展和人们生活水平的提高&#xff0c;汽车租赁行业迎来了新的发展机…

作者头像 李华
网站建设 2026/5/3 5:01:04

Playnite游戏库管理工具:如何快速整合多平台游戏的终极指南

在数字游戏时代&#xff0c;玩家们往往面临着管理多个游戏平台的挑战。每个平台都有其独立的游戏库、启动器和界面&#xff0c;导致游戏体验的碎片化。Playnite作为一款开源的游戏库管理解决方案&#xff0c;通过统一接口技术彻底改变了这一现状&#xff0c;让玩家能够在一个界…

作者头像 李华