? ??? 類與對象
? ??????使用?關鍵字 class 聲明一個類;
? ? ? ? 使用?關鍵字 new 創(chuàng)建一個對象, new 可以省略;
? ? ? ? 所有對象都繼承于 Object 類;
? ????構造方法
? ? ????如果沒有自定義構造方法,則會有個默認構造?方法, 并且該構造函數(shù)會?調(diào)用其父類?的無參數(shù)構造方法;
? ? ????如果存在自定義構造方法,則 默認構造方法無效;
? ? ? ??構造方法不能重載(不能存在同名的構造方法);
? ??????子類不會繼承父類的構造函數(shù),如果子類沒有聲明構造函數(shù),那么只會有一個默認無參數(shù)的構造函數(shù)。
? ? ? ? ? ? 注意:?所有未初始化的實例變量其值均為?null;

? ? ? ? 使用?命名構造方法,可以實現(xiàn)多個構造方法;
? ??????????? 使用 類名.?方法 的形式實現(xiàn)

? ? 常量構造函數(shù)
? ??????一些類提供了?常量構造函數(shù)。使用常量構造函數(shù),在構造函數(shù)名之前加?const?關鍵字,來創(chuàng)建編譯時常量時,兩個使用?相同構造函數(shù)?相同參數(shù)值?構造的編譯時常量是同一個對象:

? ??計算屬性
? ??????計算屬性的值是通過計算而來,本身不存儲值;
? ? ? ? 計算屬性賦值,其實是通過計算轉換到其他實例變量;

? ??調(diào)用父類非默認構造函數(shù)
? ??????子類的構造函數(shù)會調(diào)用父類的匿名無參數(shù)構造方法,并且該調(diào)用會在子類構造函數(shù)的函數(shù)體代碼執(zhí)行前,如果子類構造函數(shù)還有一個 初始化列表,那么該初始化列表會在調(diào)用父類的該構造函數(shù)之前被執(zhí)行,總的來說,這三者的調(diào)用順序如下(重要):
? ? ? ? 1 初始化列表;
? ? ? ? 2 父類的無參數(shù)構造函數(shù);
? ? ? ? 3 當前類的構造函數(shù);
? ??????如果?父類沒有匿名無參數(shù)構造函數(shù),那么子類必須調(diào)用父類的其中一個構造函數(shù),為子類的構造函數(shù)?指定一個父類的構造函數(shù)?只需在構造函數(shù)體前使用(:)指定。

? ??初始化列表
? ?????????除了?調(diào)用父類構造函數(shù)?之外,還可以在?構造函數(shù)體執(zhí)行之前?初始化實例變量。每個實例變量之間使用?逗號?分隔;
? ? ? ? ? 注意:初始化列表會在構造方法體執(zhí)行?之前?執(zhí)行,初始化列表表達式 = 右邊的語句?不能使用?this?關鍵字。
? ????????初始化列表常?用于設置 final 變量的值 (跟語法糖作用一樣);

? ? 重定向構造函數(shù)
? ??????有時候類中的構造函數(shù)僅用于?調(diào)用類中其它的構造函數(shù),此時該構造函數(shù)沒有函數(shù)體,只需在函數(shù)簽名后使用(:)指定需要重定向到的其它構造函數(shù) (使用?this?而非類名):

? ??常量構造函數(shù)
? ??????如果類生成的對象都是不變的,可以在生成這些對象時就將其變?yōu)榫幾g時常量。你可以在類的構造函數(shù)前加上?const?關鍵字并確保所有?實例變量?均為?final?來實現(xiàn)該功能;

????工廠構造函數(shù)
? ??????工廠構造方法類似于設計模式中的工廠模式;
? ? ? ? 在構造方法前添加?關鍵字 factory 實現(xiàn) 一個工廠構造方法,這將意味著使用該構造函數(shù)構造類的實例時?并非總是會返回 新的實例對象;
????????例如,工廠構造函數(shù)可能會從緩存中返回一個實例,或者返回一個子類型的實例;
? ? ? ? 在工廠構造方法中 可返回對象;
? ? ? ? 注意:?在工廠構造函數(shù)中無法訪問?this!
? ???????Logger?的工廠構造函數(shù)從緩存中返回對象,和?Logger.fromJson?工廠構造函數(shù)從 JSON 對象中初始化一個最終變量;

? ??靜態(tài)成員
? ???????使用 關鍵字 static 來實現(xiàn)?類級別?的變量和函數(shù);
? ? ? ? 靜態(tài)成員 不能訪問 非靜態(tài)成員,非靜態(tài)成員可以訪問靜態(tài)成員;
? ? ? ? 1.?靜態(tài)變量
????????????靜態(tài)變量(即類變量)常用于聲明類范圍內(nèi)所屬的狀態(tài)變量和常量:
? ? ? ? ????類中的常量需要使用 static const 聲明;

? ???? ?2. 靜態(tài)方法
? ??????????靜態(tài)方法(即類方法)不能對實例進行操作,因此?不能使用?this。但是他們可以訪問靜態(tài)變量;

? ??對象操作符
? ???????條件成員訪問:?.? ? // ?前面不為空就接著執(zhí)行, 為空就不執(zhí)行. 后面得
? ? ? ? ?類型轉換 : as
? ? ? ? ?是否指定類型: is , is!? // 有點像 instanceof
? ? ? ? ?級聯(lián)模式:?..

? ??操作符復寫(運算符的重載)
? ??????復寫操作符需要在類中定義
? ??????????返回類型?operator?操作符 (參數(shù)1, 參數(shù)2, ....){
? ? ? ? ? ? ? // 實現(xiàn)code
? ????????????return 返回值
????????????}

? ? ? ? 注意:如果覆寫 ==, 還需要覆寫對象的 hashCode getter 方法;
? ? ? ? 可覆寫的操作符
? ? ? ? ? ? < 、+、|、[]、>、/、^、[]=、 <=、~/、&、~、>=、*、<<、==、-、%、>>
? ??????對象 call 方法 (還是不建議使用)
? ??????????如果類實現(xiàn)了 call() 方法 , 則?該類的對象?可以作為?方法?使用;

? ??Getter 和 Setter
? ??????Getter 和 Setter 是一對用來讀寫對象屬性的特殊方法,上面說過實例對象的每一個屬性都有一個隱式的 Getter 方法,如果為非 final 屬性的話還會有一個 Setter 方法,你可以使用?get?和?set?關鍵字為額外的屬性添加 Getter 和 Setter 方法:

面向對象擴展
? ??繼承
????????使用?關鍵字 extends?繼承一個類,并可使用?關鍵字?super?引用一個父類;
????????子類會繼承父類可見的屬性 和方法,不會繼承構造方法;
?????????子類可以重寫父類的實例方法(包括操作符)、 Getter 以及 Setter 方法。你可以使用?@override?注解來表示你重寫了一個成員;
??? ??????單繼承, 多態(tài)性

抽象類(像其他語言的接口)
????????抽象類使用 關鍵字 abstract 表示 ,不能直接被實例化;
? ? ? ? 抽象方法不用?abstract 裝飾, 無實現(xiàn);
? ??????抽象類?可以?沒有抽象方法;
? ? ? ? 有抽象方法的類一定得聲明為抽象類;
? ??????抽象類常用于聲明接口方法(重要)、有時也會有具體的方法實現(xiàn);

?接口 (和其他語言接口不同)
????類和接口是統(tǒng)一的,?類就是接口;
? ? 每個類都隱式的定義了一個包含所有實例成員的接口;
? ? 如果是復用已有類的實現(xiàn),使用繼承(extends) (因為接口都是要重寫屬性和方法);
? ? 如果只是使用已有類得外在行為,使用接口(implements);
? ??如果需要實現(xiàn)多個類接口,可以使用逗號分割每個接口類:
? ? ? ? ? ?class Point implements Comparable, Location {...}

? ??注意:?推薦 使用 抽象類的形式作為接口;
Mixin (重要)
? ?1 Mixins 類似于多繼承, 是在多類繼承中重用一個類代碼的方式;
? ??????使用?with?關鍵字并在其后跟上 Mixin 類的名字來使用 Mixin 模式:
? ?2 作為 Mixin的類 不能有顯示聲明構造方法, 比如:

? 3 作為 Mixin 的類,只能繼承子 Object, 比如 A,B, C 不能extends 其他類
? 4 使用關鍵字?with?連接 一個或多個 mixin
? ? ?A,B,C,D 四個類
? ??class D extends A with B, C { }
????簡寫 class D = A with B , C, 此寫法適合?D 中沒有自己的屬性和方法
? ? 如果方法 A, B, C 中方法同名,調(diào)用最后一個繼承的 方法,上面就是 調(diào)用C中的方法;

? ? 注意:請記住 想要實現(xiàn)一個 Mixin,請創(chuàng)建一個繼承自 Object 且 未聲明構造函數(shù)的類!
枚舉類型
? ??index 從0 開始, 依次累加
? ? 不能指定原始值;
? ? 不能添加方法;
? ??枚舉不能成為子類,也不可以 mix in,你也不可以實現(xiàn)一個枚舉;
????不能顯式地實例化一個枚舉類;
? ??每一個枚舉值都有一個名為?index?成員變量的 Getter 方法
? ??enum Color { red, green, blue }
? ??assert(Color.red.index == 0);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ??assert(Color.green.index == 1);?
? ??assert(Color.blue.index == 2);
? ??使用枚舉類的?values?方法獲取全部的枚舉值
? ??????List<Color> colors = Color.values;
????????assert(colors[2] == Color.blue);
泛型
? ? 泛型的作用:
? ??????泛型常用于需要要求類型安全的情況,但是它也會對代碼運行有好處:
? ? ? ? ? ? 1. 適當?shù)刂付ǚ盒涂梢愿玫貛椭a生成;
? ? ? ? ? ? 2. 使用泛型可以減少代碼重復。
? ? 泛型的使用
? ? ? ? ? ?1 泛型類

? ? ? ? ? ?2 泛型方法
? ??????????????方法?first<T>?的泛型?T?可以在如下地方使用:
????????????????????函數(shù)的返回值類型 (T);
????????????????????參數(shù)的類型 (List<T>);
????????????????????局部變量的類型 (T tmp);

限制參數(shù)化類型
? ??子類限制繼承?Object :

? ? 規(guī)定了要使用?SomeBaseClass?或者它的子類來作為泛型參數(shù):
