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 {}
...
}