const变量默认是static的吗?下述三种变量声明写法是否等同?
问题结论
这三种变量声明写法完全不等同,所谓「const变量默认是static类型」的说法仅在类成员声明的特定场景下有参考意义,本身不是准确表述,三者的作用、适用场景差异如下:
各声明的具体区别
- 写法1:
const String name = "John";- 若声明在全局作用域/函数局部作用域:属于普通编译时常量,遵循常规变量作用域规则,运行时不可修改值,和static没有任何关联
- 若声明在类内部:Dart语法不允许类定义非static的const实例成员,这么写会直接触发编译错误,不存在默认隐式加static的情况
- 写法2:
static String name = "Tom";
仅允许声明在类内部,属于类级别的可变静态变量,所有类实例共享同一份值,类加载时完成初始化,不需要创建实例即可访问,运行时可以重新赋值 - 写法3:
static const name = "Alex";
仅允许声明在类内部,属于类级别的编译时常量,Dart会自动推断变量类型为String,值不可修改,归类所有无需实例即可访问,等同于类内的static const String name = "Alex";
常见误区澄清
类内声明const常量必须显式加static修饰,不存在隐式默认转为static的逻辑,不加static的类内const声明会直接报错。而全局、局部作用域下的const变量和static关键字完全无关,static仅可用于修饰类成员。
内容的提问来源于stack exchange,提问作者shubham maurya
相关产品推荐
相关产品推荐

