類與對象
- 使用關鍵字 class 聲明一個類
- 使用關鍵字 new 創建一個對象,new 可以省略
- 所有對象都繼承於 Object 類
對象的基礎定義與創建
// 定義一個Person類
class Person{
}
void main(){
//創建方式一: 可以通過 new 關鍵字創建
Person person = new Person();
// 創建方式二:直接使用 Person()
Person person1 = Person();
}
屬性和方法
- 屬性默認會生成 getter 和 setter 方法
- 使用 final 聲明的屬性只有 getter 方法
- 屬性和方法通過 . 訪問
- 方法不能被重載
圖:final 屬性報錯圖示
圖:方法不能重載報錯圖示
類以及成員可見性
- Dart 中的可見性以 library(庫)爲單位
- 默認情況下,每一個 Dart 文件就是一個庫
- 使用 _ 表示庫的私有性
- 使用 import 導入庫
將成員變量或者方法加上 “_” 就表示私有的(;類似於 Java 中的 private),在另外一個 dart 文件中就無法訪問。
A類的 屬性 或者 方法 如果是以下劃線開頭命名的,則在 B類 則不能訪問A類的屬性和方法。
如果 A類 聲明也是下劃線開頭命名的則 A類的訪問範圍只能在 A類 所處的 dart 文件,出了這個 dart 文件的範圍 在別的文件是訪問不到的。
類的計算屬性
前面介紹的是存儲屬性,是可以存入這個類的一些特性的值
- 顧明思議,計算屬性的值是通過計算而來,本身不存儲值
- 計算屬性賦值,其實是通過計算轉換到其他實例變量
計算屬性指的是和一般的類成員屬性一樣,具有 getter 與 setter 方法,但是不能作爲存儲值使用,只能返回的是結算之後的結果值。
class Rectangle {
num width, heigth;
/** 計算屬性的寫法 */
//這個寫法和下面的寫法一致 num get area { return width * heigth; }
num get area => width * heigth;
void set area(value) {
width = width / 20;
}
}
void main(List<String> args) {
var rect = new Rectangle();
rect.heigth = 20;
rect.width = 10;
// 獲取屬性
print(rect.area); // 200
// 設置屬性
rect.area = 2; // 將寬度修改爲 0.5
print(rect.area); // 10
}
構造方法
關於構造方法的幾點總結:
- 如果沒有自定義構造方法,則會有個默認構造方法
- 如果存在自定義構造方法,則默認構造方法無效
- 構造方法不能重載
- 使用命名構造方法,可以實現多個構造方法
- 使用類名.方法的形式實現
默認的構造方法 與 帶參數的構造方法
class Person{
String name;
int age;
// 默認的構造方法,無參的構造方法可以省略
// Person (){}
// 帶參數的構造方法
Person(String name, int age){
this.name = name;
this.age = age;
}
//帶參數的構造方法還可以寫成這種格式 Person(this.name, this.age){}
}
構造方法不能重載,多個構方法同時存在會報錯
給 final 關鍵字修飾的屬性賦值
class Person {
String name;
int age;
final String gender;
// 通過構造器給 final 修飾的屬性賦值
Person(this.age, this.name, this.gender);
}
多個構造方法同時存在的情況
class Person{
String name;
int age;
// 默認的構造方法,無參的構造方法可以省略
Person (){}
// 帶參數的構造方法
Person.withName(String name){
this.name = name;
}
Person.withNameAndAge(this.name, this.age){}
}
void main(List<String> args) {
Person person = new Person();
Person person1 = new Person.withName("name");
Person person2 = new Person.withNameAndAge("name", 12);
}
常量構造方法聲明
- 如果類是不可變狀態,可以把對象定義爲編譯時常量
- 使用 const 聲明構造方法,並且所有變量都爲 final
- 使用 const 聲明對象,可以省略
重要說明:
要聲明常量類需要使用 const 修飾,並且還需要所聲明類有 常量構造方法 。
const 修飾的構造方法叫常量構造方法,所有屬性也必須用final修飾。
工廠構造方法
- 工廠構造方法類似於設計模式中的工廠模式
- 在構造方法前添加關鍵字 factory 實現一個工廠構造方法
- 在工廠構造方法中可返回對象
工廠構造方法 與 普通的構造方法區別在於:普通的構造方法不能有返回值。
圖爲:普通的構造方法帶有返回值報錯提示
一個完整的 工廠構造方法例子:
class Logger{
final String name;
static final Map<String, Logger> _cache = <String, Logger>{};
factory Logger(String name){
if(_cache.containsKey(name)){
return _cache[name];
}else {
final logger = Logger._internal(name);
_cache[name] = logger;
return logger;
}
}
Logger._internal(this.name);
void log(String msg){
print(msg);
}
}
初始化列表賦值方式
初始化列表賦值的方式賦值最大的好處是給 final 屬性賦值。看圖中 Person.withMap ( Map map ) 這一段