Dart 基础知识(三)

文档地址

      类与对象

        使用 关键字 class 声明一个类;

        使用 关键字 new 创建一个对象, new 可以省略;

        所有对象都继承于 Object 类

      构造方法

        如果没有自定义构造方法,则会有个默认构造 方法, 并且该构造函数会 调用其父类 的无参数构造方法;

        如果存在自定义构造方法,则 默认构造方法无效;

        构造方法不能重载(不能存在同名的构造方法);

        子类不会继承父类的构造函数,如果子类没有声明构造函数,那么只会有一个默认无参数的构造函数。

            注意: 所有未初始化的实例变量其值均为 null

  构造方法 语法糖

        使用 命名构造方法,可以实现多个构造方法;

              使用 类名. 方法 的形式实现

类名. 方法

    常量构造函数

        一些类提供了 常量构造函数。使用常量构造函数,在构造函数名之前加 const 关键字,来创建编译时常量时,两个使用 相同构造函数 相同参数值 构造的编译时常量是同一个对象:

常量构造函数

    计算属性

        计算属性的值是通过计算而来,本身不存储值;

        计算属性赋值,其实是通过计算转换到其他实例变量;

    计算属性

    调用父类非默认构造函数

        子类的构造函数会调用父类的匿名无参数构造方法,并且该调用会在子类构造函数的函数体代码执行前,如果子类构造函数还有一个 初始化列表,那么该初始化列表会在调用父类的该构造函数之前被执行,总的来说,这三者的调用顺序如下(重要):

        1 初始化列表;

        2 父类的无参数构造函数;

        3 当前类的构造函数;

        如果 父类没有匿名无参数构造函数,那么子类必须调用父类的其中一个构造函数,为子类的构造函数 指定一个父类的构造函数 只需在构造函数体前使用(:)指定。

    初始化列表

           除了 调用父类构造函数 之外,还可以在 构造函数体执行之前 初始化实例变量。每个实例变量之间使用 逗号 分隔;

          注意:初始化列表会在构造方法体执行 之前 执行,初始化列表表达式 = 右边的语句 不能使用 this 关键字

          初始化列表常 用于设置 final 变量的值 (跟语法糖作用一样);

 初始化列表

    重定向构造函数

        有时候类中的构造函数仅用于 调用类中其它的构造函数,此时该构造函数没有函数体,只需在函数签名后使用(:)指定需要重定向到的其它构造函数 (使用 this 而非类名):

    重定向构造函数

    常量构造函数

        如果类生成的对象都是不变的,可以在生成这些对象时就将其变为编译时常量。你可以在类的构造函数前加上 const 关键字并确保所有 实例变量 均为 final 来实现该功能;

   常量构造方法

    工厂构造函数

        工厂构造方法类似于设计模式中的工厂模式;

        在构造方法前添加 关键字 factory 实现 一个工厂构造方法,这将意味着使用该构造函数构造类的实例时 并非总是会返回 新的实例对象

        例如,工厂构造函数可能会从缓存中返回一个实例,或者返回一个子类型的实例;

        在工厂构造方法中 可返回对象;

        注意: 在工厂构造函数中无法访问 this!

         Logger 的工厂构造函数从缓存中返回对象,和 Logger.fromJson 工厂构造函数从 JSON 对象中初始化一个最终变量;

工厂构造函数

    静态成员

         使用 关键字 static 来实现 类级别 的变量和函数;

        静态成员 不能访问 非静态成员,非静态成员可以访问静态成员

        1. 静态变量

            静态变量(即类变量)常用于声明类范围内所属的状态变量和常量:

            类中的常量需要使用 static const 声明;

静态变量

        2. 静态方法

            静态方法(即类方法)不能对实例进行操作,因此 不能使用 this。但是他们可以访问静态变量;

静态方法

    对象操作符

         条件成员访问:?.    // ?前面不为空就接着执行, 为空就不执行. 后面得

         类型转换 : as

         是否指定类型: is , is!  // 有点像 instanceof

         级联模式: ..

 级联模式

    操作符复写(运算符的重载)

        复写操作符需要在类中定义

            返回类型 operator 操作符 (参数1, 参数2, ....){

              // 实现code

              return 返回值

            }

操作符复写

        注意:如果覆写 ==, 还需要覆写对象的 hashCode getter 方法;

        可覆写的操作符

            < 、+、|、[]、>、/、^、[]=、 <=、~/、&、~、>=、*、<<、==、-、%、>>


        对象 call 方法 (还是不建议使用)

            如果类实现了 call() 方法 , 则 该类的对象 可以作为 方法 使用;

对象 call 方法 

    Getter 和 Setter

        Getter 和 Setter 是一对用来读写对象属性的特殊方法,上面说过实例对象的每一个属性都有一个隐式的 Getter 方法,如果为非 final 属性的话还会有一个 Setter 方法,你可以使用 get 和 set 关键字为额外的属性添加 Getter 和 Setter 方法:

Getter 和 Setter

面向对象扩展

    继承

        使用 关键字 extends 继承一个类,并可使用 关键字 super 引用一个父类;

        子类会继承父类可见的属性 和方法,不会继承构造方法

         子类可以重写父类的实例方法(包括操作符)、 Getter 以及 Setter 方法。你可以使用 @override 注解来表示你重写了一个成员;

          单继承, 多态性

extends

抽象类(像其他语言的接口)

        抽象类使用 关键字 abstract 表示 ,不能直接被实例化;

        抽象方法不用 abstract 装饰, 无实现;

        抽象类 可以 没有抽象方法

        有抽象方法的类一定得声明为抽象类

        抽象类常用于声明接口方法(重要)、有时也会有具体的方法实现;

  抽象类

 接口 (和其他语言接口不同)

    类和接口是统一的, 类就是接口;

    每个类都隐式的定义了一个包含所有实例成员的接口;

    如果是复用已有类的实现,使用继承(extends) (因为接口都是要重写属性和方法);

    如果只是使用已有类得外在行为,使用接口(implements);

    如果需要实现多个类接口,可以使用逗号分割每个接口类:

           class Point implements Comparable, Location {...}

implements

    注意推荐 使用 抽象类的形式作为接口;

Mixin (重要)

   1 Mixins 类似于多继承, 是在多类继承中重用一个类代码的方式;

        使用 with 关键字并在其后跟上 Mixin 类的名字来使用 Mixin 模式:

   2 作为 Mixin的类 不能有显示声明构造方法, 比如:

不能有显示声明构造方法

  3 作为 Mixin 的类,只能继承子 Object, 比如 A,B, C 不能extends 其他类

  4 使用关键字 with 连接 一个或多个 mixin

     A,B,C,D 四个类

    class D extends A with B, C { }

    简写 class D = A with B , C, 此写法适合 D 中没有自己的属性和方法

    如果方法 A, B, C 中方法同名,调用最后一个继承的 方法,上面就是 调用C中的方法;

Mixin

    注意:请记住 想要实现一个 Mixin,请创建一个继承自 Object 且 未声明构造函数的类!


枚举类型

    index 从0 开始, 依次累加

    不能指定原始值;

    不能添加方法;

    枚举不能成为子类,也不可以 mix in,你也不可以实现一个枚举;

    不能显式地实例化一个枚举类;

    每一个枚举值都有一个名为 index 成员变量的 Getter 方法

    enum Color { red, green, blue }

    assert(Color.red.index == 0);                                                                                      

    assert(Color.green.index == 1); 

    assert(Color.blue.index == 2);

    使用枚举类的 values 方法获取全部的枚举值

        List<Color> colors = Color.values;

        assert(colors[2] == Color.blue);


泛型

    泛型的作用

        泛型常用于需要要求类型安全的情况,但是它也会对代码运行有好处:

            1. 适当地指定泛型可以更好地帮助代码生成;

            2. 使用泛型可以减少代码重复

    泛型的使用

           1 泛型类

类的泛型

           2 泛型方法

                方法 first<T> 的泛型 T 可以在如下地方使用:

                    函数的返回值类型 (T);

                    参数的类型 (List<T>);

                    局部变量的类型 (T tmp);

方法的泛型

限制参数化类型

    子类限制继承 Object :

限制参数化类型

    规定了要使用 SomeBaseClass 或者它的子类来作为泛型参数:

限制参数化类型
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271

推荐阅读更多精彩内容