Flutter入门——Dart面向对象原理

背景

Dart作为高级语言,支持面向对象的很多特性,并且支持基于mixin的继承方式,基于mixin的继承方式是指:一个类可以继承自多个父类,相当于其他语言里的多继承。所有的类都有同一个基类Object,这和特性类似于Java语言,Java所有的类也都是继承自Object,也就是说一切皆对象。

Dart 是一门面向对象的语言, 全部的类都是继承自 Object , 除了支持传统的 继承、封装、多态, 还有基于组合(Mixin-based)的继承特性

Dart基础

1.程序入口

/**
 * 1.main函数是dart入口
 * 2.dart当中打印信息使用print函数
 */
main(List args) {
  // List args -> 列表 - 泛型
  print("Hello World");
}

2.声明变量

明确的声明

  String name = "why";

类型推导(var/final/const)

var

    // 类型推导的方式虽然没有明确的指定变量的类型, 但是变量是有自己的明确的类型
    // 2.1.var声明变量
    var age = 20;
    // age = "abc"; // 这里修改会报错
    age = 30;

final声明常量

final height = 1.88;
// height = 2.00; // 不能修改

const声明常量

const address = "广州市";
// address = "北京市"; // 不能修改

final和const的区别

// const必须赋值 常量值(编译期间需要有一个确定的值)
// final可以通过计算/函数获取一个值(运行期间来确定一个值)
// const date1 = DateTime.now(); 写法错误
final date2 = DateTime.now();

3.非零即真(❌)

var flag = "abc";

if (flag) {
 print("执行代码");
}

4.字符串

// 1.定义字符串
var str1 = 'abc';
var str2 = "abc";
var str3 = """
 // 2.字符串和表达式进行拼接
 var name = "why";
 var age = 19;
 var height = 1.88;
 
 // 强调: ${变量}, {}可以省略

 var message1 = "my name is $name, age is $age, height is $height";
 
 var message2 = "name is $name, type is ${name.runtimeType}";

 print(message1); // my name is why, age is 19, height is 1.88

 print(message2); // name is why, type is String

5.集合

// 1.列表List: [];
var names = ["abc", "cba", "nba", "cba"];
names.add("mba");

// 2.集合Set: {}; 
var movies = {"星际穿越", "大话西游", "盗梦空间"};
names = Set.from(names).toList();
print(names);

// 3.映射Map
var info = {
    "name": "why",
    "age": 18
};

Dart语法

变量

Dart中变量初始值为null,即使是int类型也可以是null(java中int默认是0, boolean默认是false);
Dart支持自识别,可以是用var定义变量,也可以直接指定具体类型;
final或者const都可修饰不可变的变量,final变量只能赋值一次,const是编译时常量。

// 指定具体类型
bool x = true;
int y = 2;
double z = 2.13;

// 用var定义变量,不用指定具体类型
var a = true;
var b = 2;
var c = 2.13;

final name = 'Tom';
const num = 200000;

基本类型

int和double是num子类,没有float类型;
支持字符串模板,用${expression}的方式来实现字符串效果,类似如字符串拼接;
String可以使用单引号或者双引号;
Dart没有数组,只有列表;
其中List,Set,Map不是抽象接口,是具体实现类,可直接使用;
Map的key没有指定类型,key类型不一致不会报错;key不能相同,但是value可以相同,value可以为null。
var name = ‘Tom’;

// 使用$来实现name参数传入
var student = 'name is:$name';

// 使用构造函数创建List对象,和java一样
var list = List();
list.add(1);

// 创建不可变List
var list1 = const[1,2];

// for-in循环,这里用到Dart中的in关键字
var list2 = [1,2,3,4];
for (var i in list2) {
  print(i);
}

void main() {
  // 通过构造器创建Map
  Map map = new Map();
  map['a'] = 'Android';
  map['b'] = 'Flutter';
  map['c'] = 'IOS';
  print(map);

  // 通过复制的方式
  Map map1 = Map.of(map);
  print(map1);

  // 直接声明来创建Map
  Map map2 = {'a': 'Android', 'b': 'Flutter', 'c': 'IOS'};
  print(map2);
}

方法

方法也是对象,方法可赋值给一个变量;
如果方法的参数是解构出来的可以通过 @required 注解标注为必填 const Scrollbar({Key key, @required Widget child});
支持可选参数,可选命名参数用{}包围,可选位置参数写在最后并且使用[]包围 String say(String from, String msg, [String device]);
支持默认参数 void enableFlags({bool bold = false, bool hidden = false}) {…};
以_开头的方法都是私有的。
void main() {

// 方法赋值给myarea对象
var myarea = _area(2,3);
print(myarea);
print(area2(2));
print(area3(2, height: 1, judge: false));
}

num _area(num width, num height) {
  return width * height;
}

// 使用@required来标注必须参数
num area1({@required num width, @required num height}) {
return width * height;
}

// 可选参数
num area2(num width, [num height]) {
if (height != null) {
return width * height;
}
return 0;
}

// 默认参数
num area3(num width, {num height = 1, bool judge = true}){
if (judge) {
return width * height;
}
return 0;

闭包

支持闭包,闭包能够访问外部方法内部的局部变量

void main() {
var foo = a();
foo ();
foo ();
foo ();
foo ();
}
// 定义闭包
a() {
  int count = 0;

// 匿名函数
return (){
    print(count++);
};

}

嵌套函数

// 外层函数
void showName(var name) {

// 函数中嵌套函数
void printName(var name) {
    print("Hello name is: $name");
}

// 使嵌套函数生效
printName(name);
}

// 主函数调用
void main() {
  showName("Tom");
}

操作符

1.空替换?? expr1 ?? expr2,如果expr1是non-null,返回其值。否则执行expr2并返回其结果;
2.条件成员访问?.P?.y = 4; 如果p是non-null,则设置y的值等于4;
3.类型判定操作符(as,is,is!);
4.级联操作,可以在同一个对象上连续调用多个函数以及访问成员变量;

// 条件操作符(特有的 ??)
var oldState ;
// 传统的写法
var newState = (oldState == null) ? oldState : 'not final';
// 使用??操作符
var newState1 = oldState ??  'not final';

// 避空(特有的?.)
void main() {
  Person person = new Person('Tom');
  Person person1 = null ;

  // person 非空,正常返回
  print(person?.name);
  // person1为空,正常返回null
  print(person1?.name);
  // peroson1为空,报异常
  print(person1.name);
}

class Person {
  final String name;

  Person(this.name);
}

// 类型判定操作符(as,is,is!,):
void main() {
  var person = new Person();

  // 判断person是不是Person类型
  if (person is! Person) {
    print("person is not Person type");
  }

  if (person is Person) {
    person.name = 'Tom';
    print(person.name);
  }

  // 上面代码可以使用as简化,as是把操作符对象转化为特定的类型
  (person as Person).name = 'Tom';
  print(person.name);

  // 上面两种写法有区别,第一种是如果是true就执行里面的内容,false就不执行;
  // 第二种情况使用as会抛出一个异常
}

class Person {
  var name;
}


// 级联操作
// 获取一个id为btn1的按钮对象
var btn = query('#btn1');
btn.text = '确定';
btn.classes.add('ButtonStyle');
btn.onClick.listen((s) => window.alert('ok'));

// 上面代码等价于
query('#btn1')
  ..text = '确定'
  ..classes.add('ButtonStyle')
  ..onClisk.listen((s) => window.alert('ok'));

异常

和java不同的是,Dart可以抛出任意类型的对象;
程序不会强制要求开发中处理异常,但若发生异常,程序会中断;
其中异常主要分为Error和Exception两种类型。

void main() {
  try {
test();
  } on RangeError catch (e) {
print(e);
  } on Error catch (e) {
print(e);
  } finally {
print('finally');
  }
}

test() {
  throw RangeError("下标越界");
}

创建对象可以不使用new关键字;
Dart中没有public,private,protected这些关键字;
没有interfaces关键字,每一个类都是一个接口。我们可以用抽象类来类比java中的接口;
Dart把多重继承的类叫做Mixins。

main() {
 var point = new Point();
 point.run();

// 这里会执行P类中的run()
  // 可以理解成优先级覆盖,子类>重用>父类
P p = new P();
p.run();

Q q = new Q();
q.run();
}

class Point {

void run() {
print("Point run...");
}
}

class Note {

void run() {
print("Note run...");
}
}

// 多继承
class P extends Point with Note {

void run() {
print("P run...");
}
}

class Q implements Point {

@override
void run() {
print("Q run...");
}

}

构造函数

支持语法糖 Point(this.x, this.y);
每个实例变量都会自动生成一个getter方法,Non-final变量还会自动生成一个setter;
命名构造函数,使用命名构造函数可以为一个类实现多个构造函数,也能更加清晰的表明你的意图;

构造函数不能被继承,如果子类没有自定义的构造函数,会有一个默认的构造函数。
void main() {

var person = new Person("张三", 18, "Wuhan");
var person1 = new Person.init("李四", 20, "Shanghai");

// setter
person.name = "张三丰";

// getter
print(person.name);
print(person);
print(person1);

}

class Person {
var name;
int age;
final String address;

@override
String toString() {
return "name:$name age:$age address:$address";
}

Person(name, age, this.address) {
   this.name = name;
   this.age = age;
   print("这里是传统的构造函数");
}

// 语法糖形式,命名构造函数
Person(this.name, this.age, this.address){
print("这里是语法糖的构造函数");
}

Person.init(this.name, this.age, this.address) {
    print("这里是命名构造函数");
}

断言

断言是如果条件表达式不满足则停止代码执行;
断言只在检查模式下运行有效,如果在生产模式下运行则不会执行。

//  确保变量是非空值
assert(text != null);
//  确保值是小于100
assert(number < 100);
//  确保这是一个 https 地址
assert(urlString.startsWith('https'));

注:检查模式是进行类型检查,如果发现实际类型和声明或期望类型不匹配就报错;生产模式是不进行类型检查,忽略声明的类型信息,比如可以忽略assert语句。Dart默认是生产模式。

小牛试刀

第一个 Dart 程序

main () {
  print("Hello Dart!");
}

启动检查模式

Dart以两种模式运行:Dart 1.x有生产模式和检查模式两种模式,Dart 2.x中移除了检查模式。

  • 生产模式(默认)
  • 检查模式

注:建议在开发/测试模式中使用检查模式运行Dart VM,因为它会添加警告和错误以帮助开发和调试过程;选中的模式会强制执行各种检查,例如类型检查等。

Dart 标识符

dart标识符可以包括字符和数字,但不能以数字开头

  • 除下划线(_)或美元符号($)外,标识符不能包含特殊符号。
  • 标识符不能是关键字。
  • 它们必须是唯一的。
  • 标识符区分大小写。
  • 标识符不能包含空格。

Dart 注释

  • 单行注释//
  • 多行注释/* */

Dart 面向对象编程(OOP)

Dart 是一种面向对象的编程语言。

  • 对象 - 对象是任何实体的实例。 根据Grady Brooch,每个对象必须具有三个功能:
  • 状态 - 由对象的属性描述。
  • 行为 - 描述对象的行为方式。
  • 标识 - 将对象与一组类似此类对象区分开的唯一值。
  • - OOP方面的类是创建对象的蓝图。 类封装了对象的数据。
  • 方法 - 方法促进对象之间的通信。
class TestClass{
  void disp(){
    print("Hello Dart!");
  }
}

void main(){
  TestClass c = new TestClass();
  c.disp();
}

/*
Hello Dart!
*/

代码说明:定义了一个类TestClass,这个类拥有一个方法disp(),方法可以实现在终端打印字符串Hello Dart!,使用new 关键字创建类的对象,该对象调用方法disp()

总结

关于dart的学习还有很多;我列出如下:Flutter高级工程师进阶学习

Dart基础

  • Dart —— 编程语言概览
  • Dart —— 语法规范
  • Dart —— 变量 ,声明方式,默认值 以及变量声明时使用的关键字变量 默认值 Final 和 Const 变量声明
  • Dart —— 基础数据类型 Number String Boolean List Map Set Rune Symbol
  • Dart —— 函数 函数参数 匿名函数
  • Dart —— 词法作用域 词法闭包
  • Dart —— 运算符 算数,关系,类型判定,赋值,逻辑,按位移位,条件,级联
  • Dart —— 流程控制语句 if and else , for, while and do-while , break and continue ,switch and case
  • Dart —— 异常 throw ,try , catch ,finally ,on Exception , rethrow
  • Dart —— 类 变量,函数 ,构造函数,隐式接口,mixin ,with ,静态变量和方法
  • Dart —— 泛型
  • Dart —— 异步支持
  • Dart —— 库的可见性 如何实现自己的库
  • Dart —— 生成器
  • Dart —— Typedefs
  • Dart —— 元数据

Dart进阶

  • 面向对象编程原则-SOLID原则
  • Dart dynamic,var,object的区别
  • Dart 构造函数详解
  • Dart 单例的四种写法
  • Dart 类的继承与混入(Mixin)详解
  • Dart 反射
  • Dart 异步模型
  • Dart 事件循环
  • Dart 任务调度
  • Dart Isolate
  • Dart 内存管理机制
  • Dart 发布公用类库
  • Dart 取消Future

Dart Library

  • dart:core 集合
  • dart:注解@pragma

你可能感兴趣的:(Android开发,flutter,flutter,android,dart)