Dart学习笔记-面向对象编程(一)

一、类与对象,声明、创建及基本特征

1、声明与创建

  • 类与对象
  • 使用关键字class声明类
  • 使用关键字new创建对象,new可省了
var person = Person();

2、Dart 类的特性

  • 属性默认生成getter和setter方法
  • 使用final声明的属性只有getter方法
  • 属性和方法通过.访问
  • 方法不能被重载
class Person{
  String name;
  int age;
  void work(){
    print("Name is $name,Age is $age,He is working...");
  }
}
  var person = Person();
  person.age = 12;
  person.name = "tom";
  print(person.age);
  person.work();

3、计算属性

  • 顾名思义,计算属性的值是通过计算而来,本身并不存储值
  • 计算属性的赋值,其实是通过计算转换到其他的实例变量
class Rectangle{
  num width,height;
  num get area => width * height;
}
  var rect = Rectangle();
  rect.height = 20;
  rect.width = 10;
  
  print(rect.area);//200

二、构造方法及初始化列表

1、构造方法

  • 如果没有自定义构造方法,则会有个默认构造方法
  • 如果存在自定义构造方法,则默认构造方法无效
  • 构造方法不能重载
class Boy{
  String name;
  int age;
  Boy(String name, int age){
    this.name = name;
    this.age = age;
    print("Name is $name,Age is $age");
  }
  void work(){
    print("Name is $name,Age is $age,He is working...");
  }
}

若存在final属性:

class Boy{
  String name;
  int age;
  inal String gender;
  Boy(String name, int age,this.gender){
    this.name = name;
    this.age = age;
    print("Name is $name,Age is $age");
  }
  void work(){
    print("Name is $name,Age is $age,He is working...");
  }
}

此时属性赋值在构造函数之前执行

构造方法语法糖:

Boy(this.name,this.age,this.gender);

同理属性赋值在构造函数之前执行

命名构造方法:
由于构造方法无法重载,要想给部分属性赋值时,可以采用赋值构造方法

class Boy{
  String name;
  int age;
  inal String gender;
  Boy(String name, int age,this.gender){
    this.name = name;
    this.age = age;
    print("Name is $name,Age is $age");
  }
  Boy.withGender(this.gender);
  void work(){
    print("Name is $name,Age is $age,He is working...");
  }
}
  var boy = Boy.withGender("男");
  boy.work();

常量构造方法:

  • 如果类是不可变状态,可以把对象定义为编译时常量
  • 使用const声明构造方法,并且所有变量都为final
  • 使用const声明对象,可以省略
class Dog{
  final String name;
  final int age;
  const Dog(this.name,this.age);
}

工厂构造方法:

  • 工厂构造方法类似于设计模式中的工厂模式
  • 在构造方法钱添加关键字factory实现一个工厂构造方法
  • 在工厂构造方法中可返回对象
class Factory{
  String message;
  factory Factory(String message){
    //message为dart时,实例化,否则返回空
    if(message == "dart"){
      return Factory.internal(message);
    }else{
      return null;
    }
  }
  Factory.internal(this.message);
} 
  var factory = Factory("Java");
  print(factory == null);//true

2、初始化列表

用于解决构造方法传入集合时,final变量的赋值问题

  • 初始化列表会在构造方法体执行之前执行
  • 使用逗号分隔初始化表达式
  • 初始化列表常用于设置final变量的值
class Girle{
  String name;
  int age;
  final String gender;
  
  Girle.withMap(Map map) : gender = map["gender"]{
    this.name = map["name"];
    this.age = map["age"]; 
  }
  
  void work(){
    print("Name is $name,Age is $age,Gender is $gender,She is working...");
  }
}
  var map = {"name":"tom","age":12,"gender":"女"};
  var girle = Girle.withMap(map);
  girle.work();

三、静态成员及对象操作符的使用

1、静态成员

  • 使用static关键字来实现类级别的变量和函数
  • 静态成员不能方位非静态成员,非静态成员可以访问静态成员
  • 类中的常量需要使用static const声明
class Page{
  static const int maxPage = 10;
  static int currentPage = 1;
  
  static void up(){
    currentPage++;
    print("currentPage = $currentPage");
  }
  
  static void down(){
    currentPage--;
    print("currentPage = $currentPage");
  }
}
Page.up();//currentPage = 2
Page.down();//currentPage = 1

2、对象操作符

条件成员访问:?.
相当于在执行之前进行判空操作,如果为null则不再执行

  var person;
  person?.age = 12;

此时如果不适用?.则会crash

类型转换:as

  person = "";
  person = Person();
  (person as Person).age = 12;

是否指定类型:"is & is! "用于判断对象的class

  if(person is Person){
    person.age = 12;
  }

级联操作

  person..name = "小李"
        ..age = 26
        ..work();

四、对象call方法

如果类实现了call()方法,则该类的对象化可以作为方法使用

class Animal{
  String call(name,age)=>"Name is $name, age is $age";
}
var animal = Animal();
print(animal("小猫",1));//Name is 小猫, age is 1

你可能感兴趣的:(Dart学习笔记)