函数
- 命名可选参数
{}
void user(String name,{int age, String sex}){
print('$name, $age, $sex');
}
void main(){
user('张三'); //张三, null, null
user('张三', age:12); //张三, 12, null
}
- 位置可选参数
[]
void user(String name,[int age, String sex]){
print('$name, $age, $sex');
}
void main(){
user('张三'); //张三, null, null
user('张三', 12); //张三, 12, null
}
- 作用域
Dart函数闭包
- js函数闭包:函数嵌套;子函数可以使用父函数的变量;函数里的变量不会被垃圾回收机制回收。
- 定义的test函数里返回另一个函数
main(List<String> args){
var t = test(10); // t是test里面返回的匿名函数
print(t(5));
}
test(int a){
return (int b){
return a+b;
};
}
类的定义
- Dart是一个面向对象编程语言,定义类用class关键字,类通常由两部分:成员、方法
main(List<String> args){
var p = new Person();
Person p1 = new Person();
print(p.name); // 成员属性,通过实例化后的对象去访问
}
// 定义类用关键字class
class Person{
// 定义属性
String name = 'll';
int age = 18;
// 定义方法
void getInfo(){
print('$name: $age'); // 同方法中没有同变量名的话,指向成员方法的变量名
// ptint('${this.name}:${this.age}')
}
}
构造函数
- 默认构造函数名字和类名一样
main(List<String> args){
var p = new Person('ll', 18);
print(p.name);
print(p.age);
}
class Person{
String name;
int age;
Person(String name, [int age]){
this.name = name;
this.age = age;
}
}
- 命名构造函数
main(List<String> args){
var p = new Person('ll', 18);
print(p.name);
}
class Person{
String name;
int age;
// Persin(String name, [int age]){
// this.name = name;
// this.age = age;
// }
// 注释写法可以简写为以下的语法糖
Person(this.name, this.age);
}
- 抽离类文件
import 'XXX.dart'
main(List<String> args){
var p = new Person();
// p._getName(); // 不能直接调用私有方法, 可以通过公有方法调用私有方法
p.getName();
}
// 抽离整个类到XXX.dart
// class Person{
_name = '私有变量';
_getName() { // 私有方法
print(_name);
};
getName(){
this._getName();
}
// }
- 私有属性的使用
- Dart中没有
public
/private
/protected
等访问修饰符
- 可以用
_
单独标记为私有属性,必须抽离到单独的文件
- 私有属性无法通过实例化后直接使用(
p._name
报错)
- 可以通过公有的方法访问到私有属性
- 初始化列表
main(List<String> args){
var p2 = new Person.test('pp', 99);
p2.getInfo();
}
class Person{
String name;
int age;
Person.test(String name, int age) : this.name = name, this.age = age;
getInfo(){
print('$name--$age');
}
}
- 静态属性和方法
main(){
print(Person.des); // 访问静态属性
print(Person.test()); // 访问静态方法
}
class Person{
String name = 'll';
int age = 20;
static String des = '我是静态属性';
static test() {
print('我是静态方法');
}
}
对象的操作符
-
is
/?
/..
main(List<String> args){
Person p;
p?.name;
Person p1 = new Person('ll', age:18);
print(p1.name);
// is
print(p1 is Person);
// ..
p1.name = 'pp';
p1.age = 21;
p1..name = '..'
..age = 22;
}
class Person{
String name;
int age;
Person(this.name, {this.age});
}
继承super关键字
main(){
var m =new Male('replace', 20);
// 可以调用成员属性和方法
print('${m.name}');
m.getInfo();
}
class Person{
String name='ll';
int age = 10;
// 1-->
// Person(this.name, this.age);
getInfo(){
print('$name--$age, 父类方法');
}
}
class Male extends Person{
// 在调用父类上的构造函数上,覆盖了成员属性的值
String name;
int age;
Male(this.name, this.age);
// -->1
// Male(this.name, this.age): super(name, age);
// 2. 继承(重写)父类方法
getInfo(){
super.getInfo();// 调用的就是父类的info方法
print('姓名 $name:年龄: $age;');
}
}
抽象类
- 定义:Dart中的抽象类, 用于定义标准,子类可以继承抽象类, 也可以用抽象类实现接口:
- Dart中抽象类没有方法体的方法我们称为抽象类
- 如果子类继承抽象类必须得实现里面的抽象类方法
- 如果把抽象类作为接口实现的话必须得实现抽象类里面定义的所有属性和方法
- 抽象类不能实例化,只能继承它的子类
- extends抽象类和implements抽象类的区别:
- 如果要复用抽象类里面的方法,并且要用抽象方法约束的话我们用extends继承抽象类
- 如果只是把抽象类当作标准的话我们就用implements实现抽象类
main(){
var m = new Male();
m.dance();
}
// 定义抽象类
abstract class Person{
// 定义抽象方法
sing();
dance();
getInfo(){
print('我是普通方法');
}
}
// 继承抽象类: 子类一定要实现父类(抽象类)的抽象方法
class Male extends Person{
@override
dance(){
print('ll在跳舞');
}
@override
sing(){
print('ll在唱歌');
}
}
// 多态:Dart中多态是父类定义一个方法不去实现,让继承它的子类去实现,每个子类有不同的表现
class Famale extends Person{
@override
dance(){
print('ll2在跳舞');
}
@override
sing(){
print('ll2在唱歌');
}
}