面向对象编程
- 面向对象编程(OOP)的三个基本特征是:
- 封装、继承、多态
- 封装:封装是对象和类概念的主要特性。
- 封装,把客观事物封装成抽象的类,并且把自己的部分属性和方法提供给其他对象调用, 而一部分属性和方法则隐藏。
- 继承:面向对象编程 (OOP) 语言的一个主要功能就是“继承”。
- 继承是指这样一种能力:它可以使用现有类的功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。
- 多态:允许将子类类型的指针赋值给父类类型的指针, 同一个函数调用会有不同的执行效果 。
Dart所有的东西都是对象,所有的对象都继承自Object类。
Dart是一门使用类和单继承的面向对象语言,所有的对象都是类的实例,并且所有的类都是Object的子类
一个类通常由属性和方法组成。
void main() {
List list = new List();
list.isEmpty;
list.add('香蕉');
list.add('香蕉1');
print(list);
Map m = new Map();
m["username"] = "张三";
m.addAll({"age": 20});
m.isEmpty;
print(m);
Object a = 123;
Object v = true;
print(a);
print(v);
}
Dart是一门使用类和单继承的面向对象语言,所有的对象都是类的实例,并且所有的类都是Object的子类
class Person {
String name = "张三";
int age = 23;
void getInfo() {
print("$name----$age”);
print("${this.name}----${this.age}”); // 两种使用时一样的
}
void setInfo(int age) {
this.age = age;
}
}
void main() {
// 实例化 二种方式
Person p1 = new Person();
// var p1 = new Person();
print(p1.name);
p1.setInfo(28);
p1.getInfo();
}
默认构造函数
class Person {
String name = '张三';
int age = 20;
// 默认构造函数
Person() {
print('这是构造函数里面的内容 这个方法在实例化的时候触发');
}
void printInfo() {
print("${this.name}----${this.age}");
}
}
默认构造函数带参数
class Person {
String name;
int age;
// 默认构造函数 带参数
Person(String name, int age) {
this.name = name;
this.age = age;
}
// 默认构造函数的简写
// Person(this.name, this.age);
void printInfo() {
print("${this.name}----${this.age}");
}
}
void main() {
Person p1 = new Person('张三', 20);
p1.printInfo();
Person p2 = new Person('李四', 25);
p2.printInfo();
}
自定义构造函数
// dart里面构造函数可以写多个
class Person {
String name;
int age;
//默认构造函数的简写
Person(this.name, this.age);
// 自定义构造函数
Person.now() {
print('我是命名构造函数');
}
// 自定义构造函数带参数
Person.setInfo(String name, int age) {
this.name = name;
this.age = age;
}
void printInfo() {
print("${this.name}----${this.age}");
}
}
void main() {
var d = new DateTime.now(); // 实例化DateTime调用它的命名构造函数
print(d);
Person p1 = new Person('张三', 20); //默认实例化类的时候调用的是 默认构造函数
Person p2 = new Person.now(); //命名构造函数
Person p3 = new Person.setInfo('李四', 30);
p3.printInfo();
}
类单独抽出模块
// lib/Person.dart
class Person {
String name;
int age;
// 默认构造函数的简写
Person(this.name, this.age);
Person.now() {
print('我是命名构造函数');
}
Person.setInfo(String name, int age) {
this.name = name;
this.age = age;
}
void printInfo() {
print("${this.name}----${this.age}");
}
}
import 'lib/Person.dart';
void main(){
Person p1=new Person.setInfo('李四1',30);
p1.printInfo();
}
私有属性、方法定义
- Dart和其他面向对象语言不一样,Data中没有 public private protected这些访问修饰符合
- 但是我们可以使用_把一个属性或者方法定义成私有。
// lib/Animal.dart
class Animal {
String _name; //私有属性
int age;
//默认构造函数的简写
Animal(this._name, this.age);
void printInfo() {
print("${this._name}----${this.age}");
}
String getName() {
return this._name;
}
void _run() {
print('这是一个私有方法');
}
execRun() {
this._run(); //类里面方法的相互调用
}
}
import 'lib/Animal.dart';
void main() {
Animal a = new Animal('小狗', 3);
print(a.getName());
a.execRun(); //间接的调用私有方法
}
get 和 set 修饰符
// 正常方法调用
class Rect {
num height;
num width;
Rect(this.height, this.width);
area() {
return this.height * this.width;
}
}
void main() {
Rect r = new Rect(10, 4);
print("面积:${r.area()}");
}
// get修饰符
class Rect {
num height;
num width;
Rect(this.height, this.width);
get area {
return this.height * this.width;
}
}
void main() {
Rect r = new Rect(10, 2);
print("面积:${r.area}"); // 注意调用直接通过访问属性的方式访问area
}
// set修饰符
class Rect {
num height;
num width;
Rect(this.height, this.width);
get area {
return this.height * this.width;
}
set areaHeight(value) {
this.height = value;
}
}
void main() {
Rect r = new Rect(10, 4);
r.areaHeight = 6;
print(r.area);
}
初始化实例变量
- Dart中我们也可以在构造函数体运行之前初始化实例变量
class Rect {
int height;
int width;
Rect(): height = 2,width = 10 {
print("${this.height}---${this.width}");
}
getArea() {
return this.height * this.width;
}
}
void main() {
Rect r = new Rect();
print(r.getArea());
}