Dart语言入门学习-类(五)

Dart 是一种基于类和 mixin 继承机制的面向对象的语言。 每个对象都是一个类的实例,所有的类都继承于 Object,这个和java语言没什么区别

使用类成员变量

我们看一下类的初始化以及赋值

 //类的初始化
var p = Point(2, 2);
// 为实例的变量 y 设置值。
p.y = 3;

使用 ?. 来代替 . , 可以避免因为左边对象可能为 null , 导致的异常:

// 如果类p不为null,设置它的变量 y 等于 4。
p?.y = 4;

这个不同于java要有个空判断,这里不需要判断,直接赋值符合前面加个?即可。

使用构造函数

创建类的实例有两种方式,一种是通过类名,一种是通过类的标识符

void main() {
  var p1 = Human('男');
  var p2 = new Human('男');
  var p3 = Human.male('male', 2);
  var p4 = new Human.male('male', 2);
}

class Human {
  String gender;
  int age;
  Human(this.gender) {}
  Human.male(this.gender, this.age) {}
}

上面定义了一个Human类,创建类的实例的时候可以使用new,也可以不使用new。如果有常量构造函数,也可以通过在前面加上const创建一个常量,如果创建两个相同的实例前面都有const,你们这两个实例是相等的,否则不相等,我们来测试一下

void main() {
  var p1 = Human('男', 1);
  var p2 = Human('男', 1); // 创建一个非常量对象
  var p3 = const Human('男', 1);// 创建一个常量对象
  var p4 = const Human('男', 1);
  print(p1==p2);
  print(p3==p4);
  print(p1==p3);
}

class Human {
  final String gender;
  final int age;
  const Human(this.gender, this.age);
}

运行结果为

false
true
false

因为p3和p4是常量,所以他们初始化的对象是相等的,

获取一个对象类型

使用对象的runtimeType关键字可以获取对象的类型,

void main() {
  var p1 = Human('男', 1);
  print('The type of a is ${p1.runtimeType}');
}

运行结果为

The type of a is Human

实例变量

我们之前说过在dart中数字也是个对象,所以当他没初始化的时候,没人值为null,这个和java语言有点区别,我们看下

class Point {
  num x; // 声明示例变量 x,初始值为 null 。
  num z = 0; // 声明示例变量 z,初始值为 0 。
}

构造函数

在没有声明构造函数的情况下, Dart 会提供一个默认的构造函数。 默认构造函数没有参数并会调用父类的无参构造函数。这个和java很相似,有参数的构造函数书写有两种方式

class Human1 {
  num x, y;
  Human1(num x, num y) {
    this.x = x;
    this.y = y;
  }
}

class Human2 {
  num x, y;
  Human2(this.x, this.y);
}

这两种方式实现的结果都一样,第一种方式是java中常见的,第二种方式相对来说更简洁一些。构造函数还可以像上面通过添加标识符来构建。构造函数不能够被继承,父类的命名构造函数不会被子类继承。 如果希望使用父类中定义的命名构造函数创建子类, 就必须在子类中实现该构造函数。

class Human2 {
  num x, y;
  Human2(this.x, this.y);

  // 标识符构造函数
  Human2.origin() {
    x = 0;
    y = 0;
  }
}

使用标识符构造函数可为一个类实现多个构造函数。如果父类中没有无参的构造函数, 则需要手工调用父类的其他构造函数。 在当前构造函数冒号 (? 之后,函数体之前,声明调用父类构造函数。

class Person {
  String firstName;
  Person.fromJson(Map data) {
    print('in Person');
  }
}

class Employee extends Person {
  Employee.fromJson(Map data) : super.fromJson(data) {
    print('in Employee');
  }
}

main() {
  var emp = new Employee.fromJson({});
  if (emp is Person) {
    emp.firstName = 'Bob';
  }
  (emp as Person).firstName = 'Bob';
}

方法

抽象类

隐式接口

继承一个类

枚举类型

给一个类添加mixins特性

类的变量和方法

posted @ 2019-05-17 23:14  数据结构和算法  阅读(85)  评论(0编辑  收藏  举报