前言:
上次跟你们说过,从这篇开始我们就进入到面向对象阶段的学习了,不过呢,在真正接触到面向对象的核心知识前,我们有必要先学习一下Dart中的方法,我们首先要知道的是,面向对象指的是一种编程思想,简单来说就是把事情交给对象去做,不用自己亲自动手,现在听起来可能有点不太理解,很正常,因为它是一个很深层次的概念,你只要理解透了这种思想,以后学习其他面向对象语言就很容易上手了。我相信等你们看完本系列文章,会对面向对象有一定认知的。在Dart中,一切都是对象,方法也不例外。所以说方法里面也涉及到了面向对象的思想。好了,下面依旧给出前面系列文章地址。接下来开始今天的介绍吧!
一,方法定义:
方法是语句的集合,它们在一起执行一个功能。它在程序中被创建,在其他地方被引用。Dart当中方法最基本的定义如下:
返回类型 方法名 (参数1,参数2,...){ 方法体... return 返回值}
还记得我们的程序入口main 方法么,我们以前都是写 void main(){...} 其实main方法也是可以有参数的,只不过你没法在代码中直接给它传值,注意main方法的参数只有list类型,你可以这样写测试 void main(List args){print(args);} 这样直接运行的话就是会打印一个空list [],如果想给它传值的话,我们就需要使用命令行的方式来添加值并运行代码示例了,下面我截了一张图给大家看看具体怎么操作的,有基础的同学可能会觉得和Java很类似,我是在vscode里面演示的,大家也可以在系统cmd里面操作,这就是为什么当初要配置环境变量了,配置了这些你就可以使用Dart的一些命令了。
这样的话,你就可以打印main方法的参数值了,其实这个可能在工作中用不到很多,这里只是让小伙伴了解一下,好了,接下来我们还是到代码中来看看,其他方法的定义吧!
void main(List args) {
print(args);
print(getNameOrAge('james', 34));
print(getName('kobe'));
getNameandAge('curry',28);
}
//这是最基本的方法定义实例
// String getNameOrAge(String name,int age){
// return 'name:$name age:$age' ;
// }
/**
*Dart中可以使用箭头语法来简写return语句,这是Dart的一个特性,很常用
*前提是只有一个表达式
*/
int flag = 1;
getNameOrAge(String name,int age) => flag == 2 ? 'name:$name age:$age':23;
/**
*Dart中方法返回类型和参数类型都是可以省略的
*方法都是会有一个返回值的,不写的话就是null
*/
getName(name){
// return 'name:$name' ; 不给返回值默认返回null
}
//void是无返回值类型,可以省略掉
void getNameandAge(String name,int age){
print('name:$name age:$age');
}
二,可选参数:
可选参数是什么,就是我们在调用方法的时候,参数可传可不传,它让我们使用方法传参时能更加灵活,我们通过代码来看看可选参数的定义以及用法示例!
void main(){
/**
* 可选参数方法定义方式(共同点就是可选参数不能定义在常规参数前面且传参时可选传):
* 1.可选命名参数:{param1,param2,...}
* 定义时指定参数名称,传参时按名称来传,传参位置顺序可随意,
* 2.可选位置参数:[param1,param2,...]
* 这种定义时,传参必须按照类型顺序传
*/
printPerson('james');
printPerson('james',sex:'man');
printPerson('james',age:34,sex:'man');
printPerson2('kobe');
printPerson2('kobe',38);
printPerson2('kobe',38,'man');
/**
* 可变参数添加默认值,当不传值时就取默认值,传值就覆盖
*/
printPerson3('杜兰特');
printPerson3('杜兰特',age:34,sex:'women');
}
printPerson(String name,{int age,String sex}) => print('name:$name,age:$age,sex:$sex');
printPerson2(String name,[int age,String sex]) => print('name:$name,age:$age,sex:$sex');
printPerson3(String name,{int age = 30,String sex = 'man'}) => print('name:$name,age:$age,sex:$sex');
三,方法对象:
我们刚才说dart中的一切都是对象,那么方法也是对象,在Dart中方法有一个特定的类型叫Function,具体的我们还是通过代码来看一看
/**
* dart中一切都是对象,所以方法也是对象
* 1.方法可作为对象赋值给其他变量
* 2.方法可作为参数传递给其他方法
*/
void main(){
/**
*第一种用法的示例
*/
//var fun = printHello;
Function fun = printHello;
fun();
/**
*第二种用法示例
*/
var list = [5,8,2];
list.forEach(print);
var list2 = ['l','o','v','e'];
print(listTimes(list2,times));
}
/**
* 箭头方法可使用在方法体只有一个表达式的时候
*/
printHello() => print('kobe');
List listTimes(List list,String times(str)){
for (var i = 0; i < list.length; i++) {
list[i] = times(list[i]);
}
return list;
}
String times(str) => str*3;
四,匿名方法:
匿名方法和普通的方法不太一样,它没有具体的返回类型,也没有方法的名字,而且它需要定义在main方法里面,它既然是方法,所以方法有的特性它也一样,还是那句话,Dart中一切都是对象。我们通过代码来看看吧!
/**
*匿名方法的基本格式:
*(参数){方法体... return}
*/
void main(){
//这种方式不推荐使用,其实就是把整个匿名方法当作参数了 (匿名方法)();
// ((){
// print('james');
// })();
//var fun = (str) => print('str = $str');
var fun = (str){
print('str = $str');
};
//把匿名方法赋值给变量
fun('james');
var list2 = ['l','o','v','e'];
//print(listTimes(list2,(str){return str*3 ;}));
print(listTimes2(list2));
}
List listTimes(List list,String times(str)){
for (var i = 0; i < list.length; i++) {
list[i] = times(list[i]);
}
return list;
}
List listTimes2(List list){
var fun = (str){return str*3;};
for (var i = 0; i < list.length; i++) {
list[i] = fun(list[i]);
}
return list;
}
五,闭包:
Dart中的闭包和Python,js,kotlin等语言当中的都很类似,可能很多人都不理解是什么意思,首先闭包是一个方法那么也就是对象,它是定义在其他方法内部的,我们使用闭包最大的用处是让其访问外部方法的局部变量,并能持有其状态。要知道我们是没办法在其他地方访问方法的局部变量的,这个时候闭包就能帮我们解决这个问题,好了,具体我们到代码里面来看看!
/**
* 闭包:
* 1.闭包是一个方法(对象);
* 2.闭包定义在其它方法内部;
* 3.闭包能访问外部方法内的局部变量,并持有其状态
*/
void main(){
var fun = a();
fun();
fun();
fun();
fun();
}
//闭包是什么,这个时候,我们就可以称getFlag方法或者匿名方法是闭包了。
a(){
int flag = 1;
// getFlag(){
// print(flag++);
// }
// return getFlag;
return (){print(flag++);};
}
好了,通过上面的五部分的介绍,我们基本把Dart中涉及到方法的部分,给说完了。小伙伴们有没有体会到一点面向对象的思想呢,当然这里只是涉及到了对象,但也可以作为我们进入面向对象编程世界的第一步了,那么从下篇文章开始我们就真正开始接触到面向对象的核心知识了,小伙伴们有没有很期待呢!希望小白们把这前面的文章都消化一下,后面理解起来就更容易了。本篇文章代码示例地址在这 https://github.com/OMGyan/dart_study/tree/master/chapter5
以上!