「Dart编程语言」Dart类实例变量的初始化

Dart类通过构造器可以创建一个实例对象,Dart语言提供了初始化列表功能完成实例变量的初始化工作,当一个Dart类继承于一个父类时,子类和父类的实例变量初始化工作又变得复杂了,本文将介绍Dart语言是如何初始化各种场景下的实例变量。

构造器初始化列表

类实例变量不仅可以使用构造器参数进行赋值,Dart语言还提供了初始化列表(initializer list)用以设置实例变量的值。如下图1所示,第5行代码为Shape类的一个缺省构造器,它不提供任何的参数,我们通过使用初始化列表将实例变量color的值设置为“#FF0000”。

「Dart编程语言」Dart类实例变量的初始化

图1

图1中第12行代码使用缺省构造器创建一个Shape实例,第13行代码输出对应的实例变量color的值,如下图2所示。

「Dart编程语言」Dart类实例变量的初始化

图2

通过图2中的输出结果来看,对象s1的color值为初始化列表所设置的颜色值“#FF0000”,而不是缺省的空值。

现在我们可以在两个地方设置实例变量的值了:一个是在初始化列表中,另一个是在构造器体中。如果在这两个地方同时对同一个实例变量进行赋值操作,结果会是怎样呢?

图3中在缺省构造器中第5行和第6行代码都对实例变量color进行了赋值,初始化列表将color值设置为“#FF0000”,第6行代码位于构造器体中,也将实例变量color设置为了另外一个数值”#00FF00“。

「Dart编程语言」Dart类实例变量的初始化

图3

图3中第15行的输出为对象s1的最终颜色值,如下图4所示,其值为”#00FF00“,也就是说缺省构造器体中的颜色值设置起作用了。这是由于初始化列表的执行顺序要早于构造器体中的代码,因此最后执行的构造器体中的代码决定了实例变量的最终结果。

「Dart编程语言」Dart类实例变量的初始化

图4

子类实例变量

当类与类之间存在继承关系时,父类和子类实例变量的初始化就更为复杂了,为了演示继承关系下实例变量的初始化顺序,我们创建了另外一个Rectangle类,它继承于Shape类。Shape类的定义调整为下图5所示代码

「Dart编程语言」Dart类实例变量的初始化

图5

图5中缺省构造器只使用了初始化列表功能,并提供了一个toString方法用以显示Shape信息。图6为Rectangle类的定义,Rectangle类增加了两个实例变量width和height,初始值都设置为0.0,同样也实现了自己的toString方法,显示三个实例变量的数值。

「Dart编程语言」Dart类实例变量的初始化

图6

图7为测试程序,第16行代码显示Shape缺省构造器创建的对象s1的信息,第19行代码显示Rectangle缺省构造器创建的对象s2的信息

「Dart编程语言」Dart类实例变量的初始化

图7

「Dart编程语言」Dart类实例变量的初始化

图8

图8为对象s1和s2的输出结果,两次的输出结果color实例变量的值都为Shape缺省构造器初始化列表所设置的颜色值,这就表明子类的缺省构造器会调用父类的缺省构造器。

父类含有参数的构造器

在图5中Shape类的定义中含有一个命名构造器withColor,在子类的缺省构造器中我们有没有办法使用父类的命名构造器呢?答案是肯定的。我们将类Rectangle的定义做下调整,如下图9所示,

「Dart编程语言」Dart类实例变量的初始化

图9

图9中第26行代码我们通过使用super.withColor命名构造器对父类的实例变量进行了初始化操作,同样执行如7中的代码,这次的输出结果如图10所示。

「Dart编程语言」Dart类实例变量的初始化

图10

图10中第1行的输出结果为Shape的缺省构造器所创建的s1对象,使用了初始化列表所提供的color值;第2行的输出结果则是使用了图9中第26行代码命名构造器对color实例变量的赋值。因此两个对象s1和s2的color实例变量的值是不相同的。

Super初始化参数

Dart语言不仅提供了初始化形参构造器,还提供了super初始化参数功能,能够在构建子类实例时指定父类实例变量的值,前提是父类实现了初始化形参构造器,如下图11代码所示,将Shape的构造器实现为初始化形参构造器。

「Dart编程语言」Dart类实例变量的初始化

图11

图11中第5行代码为初始化形参构造器,通过指定一个color参数来实现对实例变量color的初始化操作。图12中重新定义了Rectangle类构造器,第26行代码也实现了一个构造器,这个构造器与图11中第5行代码不同之处在于:Shape类使用了this.color参数,而Rectangle类则使用了super.color参数。在创建Rectangle对象时,我们就可以通过Rectangle构造器来设置父类实例变量color的值。

「Dart编程语言」Dart类实例变量的初始化

图12

图13为测试代码,第15行代码使用Shape的初始化列表构造器将color实例变量的值设置为“#00FF00”,第18行代码使用Rectangle的构造器将color实例变量的值设置为“#FF00FF”,其输出结果如图14所示

「Dart编程语言」Dart类实例变量的初始化

图13

图14中第一行代码为Shape实例对象的输出信息,其值与图13中第15行代码设置的color值一致,第2行代码为Rectangle实例对象的输出信息,其值与图13中第18行代码设置的color值相同,也就是说,在类Rectangle构造器中将实例变量color进行了初始化。

「Dart编程语言」Dart类实例变量的初始化

图14

总结

Dart语言提供的初始化列表可用于设置当前类的实例变量的值,它的执行顺序要早于构造器体中的代码,如果一个类继承于另一个类,子类可以通过调用父类相应的构造器进行设置父类实例变量的值,如果父类提供了初始化形参构造器,那么子类也可以使用super初始化构造器实现对父类实例变量的赋值操作。

发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章