面向对象编程(OOP)的三个基本特征是:封装、继承、多态
封装:封装是对象和类概念的主要特性。封装,把客观事物封装成抽象的类,并且把自己的部分属性和方法提供给其他对象调用, 而一部分属性和方法则隐藏。
继承:面向对象编程 (OOP) 语言的一个主要功能就是“继承”。继承是指这样一种能力:它可以使用现有类的功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。
多态:允许将子类类型的指针赋值给父类类型的指针, 同一个函数调用会有不同的执行效果 。
Dart所有的东西都是对象,所有的对象都继承自Object类。
Dart是一门使用类和单继承的面向对象语言,所有的对象都是类的实例,并且所有的类都是Object的子类
一个类通常由属性和方法组成。
示例代码如下:
创建Rect.dart类在lib文件下,类路径为:lib/Rect.dart
class Rect {
//直接定义属性时,若不加late会提示没有初始化,有点像kotlin语言
late int height;
//下划线开头被认为是私有属性,在main方法中调用时,不能直接被访问。
//私有属性满足达到效果需要满足两个条件:1、私有属性的类单独存在于一个类中
//2、下划线开头
late int _width;
//Dart语言定义构造函数,
// 若已经定义一个构造函数后,不能再次定义同名的构造函数
Rect(int w, int h) {
this._width = w;
this.height = h;
}
//因为上面已经定义过了,再定义会报错
// Rect() {}
//次构造函数是被称为命名构造函数,写法如下
Rect.init(int w, int h) {
this._width = w;
this.height = h;
}
//类中的getter写法:get放在方法名前面,方法名后面不跟()
get area {
return this.height * this._width;
}
//自定义函数写法
int getArea() {
return this.height * this._width;
}
//类中的setter写法:set放方法名前面,注意这里的方法名,不能和属性名一模一样,我也不知道为什么。
set areawidth(int w) {
this._width = w;
}
//自定义设置属性width
void setAreaWidth(int w) {
this._width = w;
}
}
main方法调用:
注意这里import导入了Rect.dart类
import 'lib/Rect.dart';
void main() {
Rect rect = new Rect(10, 20);
int area = rect.getArea();
print(area);
rect.setAreaWidth(4);
area = rect.getArea();
print(area);
//1、定义的类单独存在于一个类文件中 2、以下划线开头被认为是私有属性
// print(rect._with);
}
打印结果:
200
80
构造方法:
在java中,我们总会提到构造函数(方法),new一个对象时,可以使用不通的构造方法实现,并且构造方法名字必须同类名一致,参数可以不同,注意:这里我说的都是java中的方式,在dart语言中,这个规则有变化。1、同类名一致的构造方法只能有一个,参数不定 2、若要重载构造方法,需要通过 类名.构造方法名 来实现次构造方法。如上诉Rect类中,主构造方法为Rect(int w, int h),次构造方法为:Rect.init(int w, int h),且主构造方法和次构造方法没有关系,没有java语言中的super调用主构造方法的说法
下面列举几个情况进行构造方法的说明:
1、不明确定义构造方法时,有默认不带任何参数的构造方法
lib/Rect.dart
class Rect {
//直接定义属性时,若不加late会提示没有初始化,有点像kotlin语言
late int height;
late int width;
//类中的getter写法:get放在方法名前面,方法名后面不跟()
get area {
return this.height * this.width;
}
}
使用类Rect.dart
import 'lib/Rect.dart';
void main() {
Rect rect = new Rect();
rect.width = 4;
rect.height = 5;
int area = rect.area;
print(area);
}
构造方法初始化列表
class Rect {
//定义属性,不加late会提示没有初始化,但是这里定义了构造方法初始化列表,可以不加late,不会报错
int height;
int width;
//
Rect():width=10,height=2{
}
//类中的getter写法:get放在方法名前面,方法名后面不跟()
get area {
return this.height * this.width;
}
}
main方法中直接调用运行,不用设置值,因为初始化列表已经赋值了
import 'lib/Rect.dart';
void main() {
Rect rect = new Rect();
int area = rect.area;
print(area);
}
图片可能显示不了,定义属性不实用late关键字时,同时去掉构造方法的初始化列表,会报错,报错代码如下:
class Rect {
//定义属性,不加late会提示没有初始化,但是这里定义了构造方法初始化列表,可以不加late,不会报错
int height;
int width;
//若没有初始化列表,Rect会报错
//提示:Non-nullable instance field 'height' must be initialized
Rect(){
}
//类中的getter写法:get放在方法名前面,方法名后面不跟()
get area {
return this.height * this.width;
}
}