美文网首页
Dart教程(三):类的定义和使用

Dart教程(三):类的定义和使用

作者: 康小曹 | 来源:发表于2019-01-09 15:45 被阅读0次

特点:

  1. 面向对象
  2. mixin继承
  3. 所有的类都继承自object

一、类的实例变量(成员变量)

对象的成员包括:function(成员函数)和data(成员变量)
点语法:略
.?的使用:不为null则赋值

// If p is non-null, set its y value to 4.
p?.y = 4;
实例变量(instance variable)

几个特点:

  1. 未初始化的实例变量的值都为null;(All uninitialized instance variables have the value null.)
  2. 每个成员变量都默认生成一个getter方法,非final修饰的实例变量会同时生成一个setter方法(All instance variables generate an implicit getter method. Non-final instance variables also generate an implicit settermethod. For details, see Getters and setters.
    )
  3. 在声明的时候初始化实例变量,这个值将在实例对象被创建时被赋值给实例变量,也就是说,这个过程发生在构造函数和初始化列表之前(If you initialize an instance variable where it is declared (instead of in a constructor or method), the value is set when the instance is created, which is before the constructor and its initializer list execute.)

初始化列表(initializer list )

二、构造函数

构造函数的两种形式:命名构造函数(ClassName.identifier)、默认构造函数(ClassName)

var p1 = Point(2, 2);
var p2 = Point.fromJson({'x': 1, 'y': 2});
const、final、static

const:变量修饰词,含义是编译时就需要被确认类型和具体的值且只能赋值一次(类似于final的强化)
final:变量修饰词,只能赋值(初始化)一次的变量
static:变量修饰词,改变变量的生命周期和存储方式(OC中),而在dart中,只有一个意思:修饰类的成员变量,被修饰的成员变量可以被这个类使用而不能被这个类的实例使用。除此之外没有其他任何意思。
static来源:

"static" means a member is available on the class itself instead of on instances of the class. That's all it means, and it isn't used for anything else. static modifies members.

例子:


static

final、const对比:

  1. final虽然是不可变(被初始化后),但是可以再运行时被初始化,所以编译时,类型和值都可以是不确定的,而const做不到
  2. const和final都是修饰var(变量),只是含义不同而已
    例子:
void main() {
  final name = 'Bob'; // 正确
//  name = 'Alice'; // 错误,final 变量只能赋值一次

//  const name1;  // 错误,const 变量是编译时常量,需要在声明时赋值进行初始化
//  final name1; // 错误,final变量需要在声明时赋值进行初始化
  const name2 = 'Alice'; // 正确

//  const name3 = name; // 错误,name 是个变量,不能赋给const
  final name4 = name2; // 正确,可以把const 常量赋给 final 变量

//  final names1 = const[name, 3, 4];  // 错误,name 是个变量,不能赋给const
  final names2 = const [name2, 'Allen', 'Brian']; // 正确

  const names3 = [
    'A',
    'B',
    'C'
  ]; // 正确。
  const names4 = const ['A', 'B', 'C']; // 正确。

  print(names3[1]);
  print(names4[1]);
}

const的规范化:
对于任何给定的const值,无论const表达式被计算多少次,都将创建并重用单个const对象。

getConst() => const [1, 2]; 
main() { 
  var a = getConst(); 
  var b = getConst(); 
  print(a === b); // true 
} 
常量构造函数

特点

  1. 包含常量构造函数的类所有的成员变量都应该使用final;
  2. 有构造函数不表示该类的所有实例都是常量,换而言之,使用const修饰的构造方法具备返回常量实例的能力,但不表示一定返回常量实例。而不用const修饰的构造函数绝对不具有返回常量实例的能力(直接报错)


    常量构造函数

栗子🌰:

void main() {
  var a = const ImmutablePoint(1, 1); // Creates a constant
  var b = ImmutablePoint(1, 1); // 不是常量,和a不相等
  var c = ImmutablePoint(1, 1); // 不是常量,和a不相等且和c也不是同一个实例
  var d = const ImmutablePoint(1, 1); // 常量,和a相等,hashcode一致
  var e = const ImmutablePoint(1, 2); // 常量但a不相等,hashcode不一致

  print(identical(a, d)); // true
  print(identical(a, c)); // false
  print(identical(b, c)); // false
  print(identical(a, e)); // false
}

class ImmutablePoint {
  static final ImmutablePoint origin = const ImmutablePoint(0, 0);
  final num x, y;
  const ImmutablePoint(this.x, this.y);
}

运行时情况:


常量构造函数

二、类的继承

mixin继承
implemnts
extends

相关文章

网友评论

      本文标题:Dart教程(三):类的定义和使用

      本文链接:https://www.haomeiwen.com/subject/xvlwrqtx.html