Dart面向对象编程(一)

206 阅读2分钟

类与对象

  • 使用关键字class声明一个类
  • 使用关键字new创建一个对象,new可以省略
  • 所有对象都继承Object类

属性与方法

  • 属性默认会生成setter和getter方法
  • 使用final声明的属性,只有getter方法
  • 属性和方法通过.来访问
  • 方法不能被重载 【与java区别,后面会提到mixins多继承也与java不同】
  • 使用_修饰的类,属性与方法为私有方法,作用域为当前library(库)
void main() {
  var p = Person();
  p.name = "Tom";
  p.age = 22;
  p.work(); //name is Tom,age is 22,he is worker
}

class Person {
  String name;
  int age;

  //箭头函数以及插值表达式
  work() => print("name is \$name,age is \$age,he is worker");
//报错不能重载
//  work(String work){
//
//  }
}

计算属性

void main() {
  var rect = Rect();
  rect.width = 20;
  rect.height = 10;
  print(rect.area); //200

  rect.area=300;
  print(rect.width);//15
}

class Rect {
  num width, height;

  //计算属性
  num get area {
    return width * height;
  }

  set area(value) {
    width = value / 20;
  }

  //面积方法
  getArea() => width * height;
}

构造方法

  • 没有定义构造方法,默认会生成一个
  • 存在自定义构造方法,则默认构造方法无效
  • 构造方法不能重载
void main(){
  var p = Person("yxjie", 28, "your heart");

  var p2 =Person.withAddress("你的肺");
}

class Person{;
  String name;

  int age;

  final String address;//只能通过语法糖方式赋值

//  Person(String name,int age){
//    this.name=name;
//    this.age=age;
//  }

  //与上面等价
  Person(this.name,this.age,this.address);
  //定义多个构造方法
  Person.withAddress(this.address);
}

常量构造方法

void main(){
  var p = Person("Jerry", 16);
//  p.name="hhah";//报错
}
class Person{
  final String name;
  final int age;
  const Person(this.name,this.age);
}

####工厂构造方法

class AndroidUtil{

  final String name;

  //工厂构造方法 特点返回一个对象实列
  factory AndroidUtil(String name){
    return AndroidUtil._innerConstruct(name);
  }

  AndroidUtil._innerConstruct(this.name);

}

初始化列表

  • 初始化列表会在构造方法体执行之前执行
  • 使用逗号分隔初始化表达式
  • 常用语设置final变量的值
//初始化列表方式赋值
  Person.withMap(map) : address = map["address"] {
    this.name = map['name'];
    this.age = map["age"];
  }

静态成员

  • 使用关键字static实现类级别的变量和函数
  • 静态成员不可以访问非静态成员,非静态成员可以访问静态成员
  • 类中常量需要使用 static const 修饰(java中用static final修饰)

####对象操作符

  • 条件运算符?.(与Kotlin一样)
  • 类型转换 as (与Kotlin一样)
  • 是否制定类型:is is!
  • 级联操作..
void main() {
  var person;
  person?.work(); //不会运行
  var p;
  p = "";
  p = Person();
  (p as Person).work();
  
  if(p is Person){
    p.work();
  }
//级联操作
  var p1 = Person();
  p1
    ..name = "jerry"
    ..age = 16;
}
class Person {
  work() => print("work ...");
}

对象call方法

Dart中对象call方法类似于java中toString方法,区别在于Dart中call方法直接调用对象实列就行,java需要对象.toString()