• Dart回顾——var 、dynamic 、Object 区分及final、const、static关键字


    一、var 、dynamic 、Object 区分

    var:声明变量,可以赋值任意对象 。Dart中var变量一旦赋值,类型便会确定,则不能再改变其类型.

    dynamic泛型:声明变量,可以赋值任意对象。声明的变量可以在后期改变赋值类型。

    Object 是Dart所有对象的根基类,也就是说所有类型都是Object的子类(包括Function和Null),所以任何类型的数据都可以赋值给Object声明的对象。

    dynamic与var一样都是关键词,声明的变量可以赋值任意对象。dynamic与Object相同之处在于,他们声明的变量可以在后期改变赋值类型。

     

    二、final、const、static关键字 

    final、const相同点:

      • 两者都是声明不可更改变量,变量只能设置一次;
      • 变量类型可以省略;

    final、const不同点:

      final:

      • 声明文件中的变量:必须在声明时赋值;
      • 声明类的成员变量:可以在声明时赋值,也可以通过构造函数赋值语法糖ClassName({this.variable}),或者初始化列表的方式赋值;

        const:

      • 编译时常量,必须定义的时候初始化;
      • const 变量是类级别的,需要标记为 static const;
      • const修饰类的构造函数时,它要求该类的所有成员都必须是final的。
      • 作为修饰值的时候,对象的整个深度状态可以在编译时完全确定,并且对象将被冻结并且完全不可变,eg:const Point(0, 0);

     

    const 变量 是隐式 final 的类型;

     

    static:用于声明类变量和类方法;

    它通常为全局数据变量管理内存。 静态变量和方法是类的成员,而不是单个实例。

    静态变量或方法对于类的每个实例都是相同的,因此,如果我们将数据成员声明为静态,则无需创建对象即可访问它。

    不需要类对象来访问静态方法或变量,我们可以通过将类名放在静态变量或方法之前来访问它。 使用类名,我们可以从其他类中调用类方法。

    它在类加载时分配一次内存,并在整个程序中使用。

    静态方法的概念也类似于静态变量。 静态方法是类的成员,而不是类实例。 静态方法只能使用静态变量,并且可以调用类的静态方法。

    不需要创建类的实例对其进行访问。 在其他类中使用静态方法时,该方法很有用。

      要点:

      • 静态变量也被标识为类变量,静态方法也被标识为类方法;
      • 可以使用类名访问静态变量和静态方法。
      • 静态方法只能使用静态变量,并且可以调用类的静态方法;
      • 静态变量/方法的特定副本分布在类的所有实例之间;
      • 在文件中,变量不能声明为static;

     

    附加:

    Note: Instance variables can be final but not const, Final instance variables must be initialized before the constructor body starts — at the variable declaration, by a constructor parameter, or in the constructor’s initializer list.

    实例变量可以是 final 类型但不能是 const 类型。 必须在构造函数体执行之前初始化 final 实例变量 —— 在变量声明中,参数构造函数中或构造函数的初始化列表中进行初始化

    为什么在Dart中不能将const声明为成员变量?

    const表示编译时常量。

    如果在运行时创建实例来创建值,则它不再是编译时常量,因此其成员也不能是const。

    静态成员不需要创建实例,因此可以是常量,无论该类是否具有const构造函数或是否与const一起使用。

    编译时常量:

    其值在编译时就能确定。

    无需重复创建实例,在内存中只有一份。

      final赋值
    初始化列表的方式
    
    class A {
    
        final value;
        
        A(int input) : value = input;
    }
    
    构造函数方式
    
    class B {
    
        int a;
        int b;
    
        B({this.a, this.b = 1});
    }
    

      参考:

      https://dart.dev/guides/language/language-tour#final-and-const

    https://www.w3adda.com/dart-tutorial/dart-static-keyword

    https://juejin.cn/post/6844903897123799054

  • 相关阅读:
    Shell 脚本中调用另一个 Shell 脚本的三种方式
    Shell脚本的三种执行方式
    python selenium中Excel数据维护(二)
    python里面的xlrd模块详解(一)
    selenium处理iframe定位于切换问题解决办法
    Selenium在定位的class含有空格的复合类的解决办法整理
    SqlSugar ORM已经支持读写分离
    ASP.NET Core的Kestrel服务器
    服务是如何加载并运行的, Kestrel、配置与环境
    ASP.NET Core Web服务器 Kestrel和Http.sys 特性详解
  • 原文地址:https://www.cnblogs.com/lulushen/p/14102682.html
Copyright © 2020-2023  润新知