Dart语言详解-1 变量

1 变量的声明

var
dynamic
Object

dynamic和Object区别:

新建一个“1-variables.dart”,添加如下代码:

void main(){
  dynamic d1 = "1234";
  Object o1 = "1234";
  d1.test();
  o1.test();
}

d1.test();不会报错
o1.test();会报错
说明dynamic编译时不会检查,Object在编译时会检查。

总结如下:

  //var声明一个初始化的变量,变量的类型不能再改变
  var variable1 =
      'hongxue'; //变量是一个引用。名字为 name 的变量引用了 一个内容为 “hongxue” 的 String 对象。
      //variable1 = 123;//变量初始化后,name变量的类型被推断为String类型,其类型不能再改变

  //dynamic和Object声明的变量初始化后,变量的类型仍可改变
  dynamic variable2 = 'hongxue';
  variable2 = 123;
  //  variable2.test();//调用不存在的test()方法,编译通过,运行报异常。编译阶段不检查类型
  Object variable3 = 'hongxue';
  variable3 = 123;
   //  variable3.test();//调用不存在的test()方法,编译不通过。编译阶段检查类型

  //使用确定类型显示声明变量,变量的类型不能再改变
  String name3;
  name3 = 'hongxue';
//  name3 = 123;//变量的类型不能再改变

//var:如果没有初始值,可以变成任何类型
//dynamic:动态任意类型,编译阶段不检查类型
//Object:动态任意类型,编译阶段检查检查类型
//区别:
//唯一区别 var 如果有初始值,类型被锁定
  • var:如果没有初始值,可以变成任何类型
  • dynamic:动态任意类型,编译阶段不检查类型
  • Object:动态任意类型,编译阶段检查检查类型

区别:

  • 唯一区别 var 如果有初始值,类型被锁定

2 默认值

没有初始化的变量自动获取一个默认值为null
一切皆对象,对象的默认值为null

  //没有初始化的变量默认值都是null。一切皆对象,对象的默认值是null
  bool isEmpty;
  assert(isEmpty == null);

3 final和const

共同点:

  1. 声明的类型可省略
  2. 初始化后不能再赋值
  3. 不能和var同时使用
  //1.  被final或者const修饰的变量,变量类型可以省略
  final fVariable1 = 'hongxue';
//  final String fVariable1 = 'hongxue';
  const cVariable1 = 'hongxue';
//  const String cVariable1 = 'hongxue';

  //2.  被 final 或 const 修饰的变量无法再去修改其值。
//   fVariable1 = 'damon';
//   cVariable1 = 'damon';

  //3.  final或const不能和var同时使用。
//  final var fVariable1 = 'hongxue';
//  const var fVariable1 = 'hongxue';

区别(需要注意的地方):

  1. 类级别常量,使用static const
  2. const可使用其他const 常量的值来初始化其值
  3. 使用const赋值声明,const可省略
  4. 可以更改非final、非const变量的值,即使曾经具有const值
  5. const导致的不可变性是可传递的
  6. 相同的const常量不会在内存中重复创建
  7. const需要是编译时常量
  //4.  如果是类级别常量,使用static const
  DateTime; //可参照DateTime static const int monday = 1;

  //5.  const可以使用其他 const常量的值来初始化其值
  const width = 100;
  const height = 100;
  const square = width * height;

  //6.  const赋值 申明可省略
  const List clist = [1, 2, 3];
//  const List clist = const [1, 2, 3];//dart 2之前,const赋值必须用const声明

  //7.  可以更改非final,非const变量的值,即使它曾经具有const值
  var varList = const [1, 2, 3];
  final finalList = const [1, 2, 3];
  const constList = [1, 2, 3];
  varList = [1];
//  constList = [1];
//  finalList = [1];

  //8.  const导致的不可变性是可传递的
  final List ls = [1, 2, 3];
  ls[1] = 4;
  print(ls);
  const List ls1 = [1, 2, 3];
//  ls1[1] = 4;

  //9. 相同的const常量不会在内存中重复创建
  final finalList1 = [1, 2];
  final finalList2 = [1, 2];
  print(identical(finalList1, finalList2)); //identical用于检查两个引用是否指向同一个对象

  const constList1 = [1, 2];
  const constList2 = [1, 2];
  print(identical(constList1, constList2)); //identical用于检查两个引用是否指向同一个对象

  //10. const 需要是编译时常量
  final DateTime finalDateTime = DateTime.now();
  //  const DateTime constDateTime = DateTime.now();//DateTime.now() 是运行期计算出来的值

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值