天天看點

Dart 文法學習(二)

類與對象

(1)使用關鍵字class聲明一個類

(2)使用關鍵字new 建立一個對象,new 可以省略

(3)所有對象預設繼承Object類

屬性與方法

屬性預設會生成getter/ setter 方法

使用final聲明的屬性隻有getter方法

屬性和方法通過.通路

方法不能被重載

void main(){
  //兩種建立方式
  var person=new Person();
  var person2=Person();
  //預設set|get  ,屬性和方法通過.通路
  person.name="小紅";
  person.age=10;
  person.say("Hello Flutter");
  //fnal 聲明的屬性隻有getter 方法
//  person.gender="";
  print(person.name);
}

class Person {
  String name;
  int age;
  final String gender="female";

  void say(String str){
    print(str);
  }
  //方法不能被重載
//  void say(int data){
//    print(data);
//  }
}      

類及成員可見性

Dart中可見性以library為機關

預設情況下,每一個Dart檔案就是一個庫

使用_表示庫的私有性

使用import導入一個庫

計算屬性

構造方法

如果沒有自定義的構造方法就會有一個預設的構造方法

如果存在自定義構造方法,則預設構造方法無效

構造方法不能重載

命名構造方法

使用命名構造方法,可以實作多個構造方法

使用類名.方法的形式實作

void main() {
  var dog=Dog("小狗",2,"2kg");
  var dog2=Dog.withName("小狗2","3kg");
  var dog3=Dog.withAge(3,"2kg");

  print(dog3.age);
}

class Dog {
  String name;
  int age;
  final String weight;
//  Dog(String name,int age,String weight){
//    this.name=name;
//    this.age=age;
//    this.weight=weight;
//  }
  Dog(this.name,this.age,this.weight);//這種方式是在構造方法被調用前對屬性指派
  //命名構造方法
  Dog.withName(String name,this.weight){
    this.name=name;
  }
  Dog.withAge(this.age ,this.weight);
}
      

常量構造方法

如果類是不可變狀态,可以把對象定義為編譯時常量

使用const 聲明構造方法,并且所有變量都變為final

使用const聲明對象,可以省略

void main() {
  //常量構造方法
  const cat=const Cat("貓");
}
//常量構造方法
class Cat{
  final String name;
  const Cat(this.name);
}      

工廠構造方法

工廠構造方法類似于設計模式中的工廠模式

在構造方法前添加關鍵字factory 實作一個工廠構造方法

在工廠構造方法中可傳回對象

初始化清單

(1)初始化清單會在構造方法體執行之前執行,常用于設定final變量的值

(2)使用逗号分隔初始化表達式

//使用import導入一個庫
import 'package:flutter_app/dart/fruit.dart';

void main() {
var person=Person("male");
var person2=Person.withParameters("小明",8,"male");
print(person.gender);
print(person2.age);
}

class Person {
  String name;
  int age;
  final String gender;

  Person(String gender) : gender = gender;

  Person.withParameters(String name, int age, String gender)
      : name = name,
        age = age,
        gender = gender;
}
      

靜态成員

(1)使用static 關鍵字來實作類級别的變量和函數

(2)靜态成員不能通路非靜态成員,非靜态成員可以通路靜态成員

(3)類中的常量需要使用 static const 聲明

void main() {
  LogUtil.e();
}

class LogUtil {
  //類中的常量需要使用 static const 聲明
  static const String defalut_msg="defalut_msg";
  static String msg = "error";

  //靜态成員不能通路非靜态成員
  static void e() {
    print(msg);
  }

//非靜态成員可以通路靜态成員
  void i() {
    print(msg);
  }
}
      

對象操作符

void main() {
  Person person;
  //條件操作符:對象為空的時候不會調用後面的方法(work)
  person?.work();
  //類型轉換
  var person2;
  person2 = new Person();
  (person2 as Person).work();
  //是否是指定類型
  var person3;
  if (person3 is! Person) {
    print("person3不是Person類型");
  }
  person3 = new Person();
  if (person3 is Person) {
    print("person3是Person類型");
  }

  //級聯操作
  var person4 = new Person();
  person4
    ..name = "小明"
    ..age = 8
    ..work();
}

class Person {
  String name;
  int age;

  void work() {
    print("Work……");
  }
}
      

對象Call方法

void main() {
  var person = new Person();
  person
    ..name = "小明"
    ..age = 8;
  //可以被當作方法調用
//  person();
  //可以當作方法,傳遞參數與傳回參數
  print(person("小明", 8));
}

class Person {
  String name;
  int age;

//  void call() {
//    print("name $name, age $age");
//  }

  String call(String name, int age) {
    print("name $name, age $age");
    return name;
  }
}