Dart-对象和类的相关概念以及使用

24 阅读3分钟

dart所有的东西都是对象,所有的对象都继承自Object类。

dart是一门使用类和单继承的面向对象语言,所有的对象都是类的实例,并且所有的类都是Object的子类。

一个类通常由属性和方法组成。

1.定义类

class Person {
  String name = '张三';
  int age = 23;

  void getInfo() {
    print('$name----$age');
  }

  //设置属性的方法
  void setInfo(int age) {
    this.age = age;
  }
}

2.实例化对象

定义完类之后,我们可以实例化对象:

var p1 = new Person();
print(p1.name);
p1.getInfo();

在实例化对象的同时,我们可以直接给出具体类型。

Person p = new Person();
p.setInfo(30);
p.getInfo();

3.构造函数

(1)构造函数会在对象实例化时被调用,如果我们想在对象对象实例化时做一些操作的话,则可以定义构造方法:

class Person {
  String name = '张三';
  int age = 23;

  //构造方法
  Person() {
    print('这是构造方法,此方法在实例化的时候触发');
  }
 ... 
}

如上,在实例化Person对象时候,会打印那句话。

(2)构造方法也是可以带参数的:

class People {
  String name = '';
  int age = 20;

  //默认构造函数
  People(String name, int age) {
    this.name = name;
    this.age = age;
  }
  ...
}

(3)上述的构造方法在dart中还有简写方式:

class People {
  String name = '';
  int age = 20;

  //默认构造函数的简写
  People(this.name, this.age);

}

(4)命名构造函数

dart提供了一些内置的类,例如我们在实例化Date对象的时候,会使用到命名构造方法:

//实例化DateTime调用它的命名构造函数
var d = new DateTime.now();
print(d);

我们自定义的类也可以定义命名构造函数:

class People {
  String name = '';
  int age = 20;

  //命名构造函数
  People.now() {
    print('命名构造函数方式');
  }
  ...
}

4.dart中把类单独放在一个文件中

在实际开发中,我们经常会把一个具体定义的类放在一个独立的文件中。

例如,我们定义一个lib文件夹,在lib文件夹下新建一个01-people.dart文件,将上述People类代码放入其中,则在需要使用的时候,通过:

import 'lib/01-people.dart';

5.私有属性和私有方法

Dart和其他面向对象语言不一样,Dart中没有public private protected这样的访问修饰符。

但是我们可以用_把一个属性或者方法定义成私有。

class Animal {
  String _name = '';
  int age = 0;

  setName(String name) {
    this._name = name;
  }

  String getName() {
    return _name;
  }

  //私有方法
  void _run() {
    print('run方法');
  }

  void execRun() {
    print('调用内部的run方法');
    _run();
  }
}

当定义的类在单独的文件中,我们在main方法中通过导入方式实例化对象之后,可以通过调用类中的方法去访问私有属性和私有方法:

Animal animal = new Animal();
animal.setName('Jack');
print(animal.getName());
animal.execRun();

6.类中getter和setter修饰符的使用

class Rect {
  int _width = 1;
  int _height = 1;

  Rect(this._width, this._height);

  int area() {
    return this._width * this._height;
  }

  //getter修饰符的用法
  get rectArea {
    return this._width * this._height;
  }

  //setter修饰符的用法
  set rectHeight(int value) {
    this._height = value;
  }
}

通过rectArea可以访问面积的值,通过rectHeight可以设置高度的值:

Rect rect = new Rect(10, 5);
print('面积:${rect.rectArea}');
rect.rectHeight = 15;
print('修改过后,面积:${rect.rectArea}');

7.在调用构造函数之前先初始化

class Rect {
  int _width = 1;
  int _height = 1;

//在调用构造函数之前先初始化属性
Rect()
     : _height = 8,
       _width = 6 {}
  ...
}