Anúncio
Anúncio

Mais conteúdo relacionado

Último(20)

Anúncio

GDSC FCU 第2堂 Kotlin

  1. Kotlin Crash Course 101 Kyle Lin @ChAoSUnItY Part 2: OOP
  2. OOP: Object Oriented Programming 甚麼是OOP? - 以物件為程式的基本單元,將程式與資料封裝進去。 - 可提高程式的重用性 (Reusability)、靈活性 (Flexibility) 、 以及擴充性 (Scalability)
  3. OOP: Object Oriented Programming 甚麼是OOP?
  4. OOP: Object Oriented Programming 物件裡包著函式和成員變數、而成員變數包著物件、而物件... - 一個物件裡可以包含: - 成員變數 (Member Field) - 函式 / 方法 (Function / Method)
  5. class ExampleObject { // Fields val immutableMemberField: Int = 1 var mutableMemberField: Int = 1 // Function fun example() {} }
  6. 可空型別:Nullable Type 甚麼是Null? - JVM裡面的物件都是以參考 (Reference)互相傳遞,當情 況需要回傳一個不存在的值,會使用null關鍵字創建空值 ,下稱Null。 - Null可以代表任何非原始型別 (Non-Primitive)。 - 注意:先前說過Kotlin的任何型別都不是原始型別!
  7. class ExampleObject {} fun example1(): ExampleObject? { return null } fun example2(): Int? { return null }
  8. 可空型別:Nullable Type Null Pointer Exception,簡稱NPE - 當要存取 (access) 成員變數 / 呼叫 (invoke) 函式時,如 果物件的實際值是空值,那麼JVM就會拋出 (throw) NPE ,全名 Null Pointer Exception。 - NPE致命之處在於跟C/C++的Segment Fault一樣,若沒 有適當處理整個程式會直接終止。
  9. 可空型別:Nullable Type Null Pointer Exception,簡稱NPE
  10. 可空型別:Nullable Type Nullable Type:Null的救星 - 試想一個情境,如果可以有非Null和可Null的型別,是不 是就針對可Null的型別做出額外的維護就不用這麼累了? - 非Null型別 (Non-Null Type),不能是空值,下簡稱 Non-null。 - 可Null型別 (Nullable Type),可以是空值,下簡稱 Nullable。
  11. Type // Non-null type Type? // Nullable type
  12. 可空型別:Nullable Type 相關運算子: ?. / ?: - 若要呼叫物件的成員 (包括成員變數和函式),而型別為 Non-null,直接使用運算子 .。 - 若型別為Nullable,則使用運算子 ?.。 - 回傳的型別根據上下文 (context) 決定。
  13. class Type { fun function(): Int = 1 } fun nullable(): Type? = null fun nonnull(): Type = Type() val a = nullable() // Gives null ?.function() // Gives nullable Int val b = nonnull() // Gives nonnull .function() // Gives nonnull Int
  14. class Type { fun function(): Int? = null } fun nullable(): Type? = null fun nonnull(): Type = Type() val a = nullable() // Gives null ?.function() // Gives nullable Int val b = nonnull() // Gives nonnull .function() // Gives nullable Int
  15. 可空型別:Nullable Type 相關運算子: ?. / ?: - 若要置換Nullable值,使用 ?: (貓王運算子,Elvis Operator)。
  16. class Type { fun function(): Int? = null } fun nullable(): Type? = null fun nonnull(): Type = Type() val a = nullable() // Gives null ?.function() // Gives nullable Int ?: 1 // Gives nonnull
  17. 一層包一層~ - 類別使用class關鍵字定義。 - 類別內成員可以是:成員變數、函式、或子類別。 - 類別內成員有分為兩種狀態,伴生 (Companion)和非伴 生。 - 伴生相同於Java的靜態,即能在物件未被初始化時存取 / 呼叫。 - 非伴生則是必須在物件有實例 (Instance)的時候才能存 取 / 呼叫。注意,實例和Nullable不是同個概念。 型別的基礎:類別 (Class)
  18. class Position(val x: Int, val y: Int) { companion object { fun fromInts(x: Int, y: Int): Postiion { return Position(x, y) } } fun toInts(): Pair<Int, Int> { return x to y } }
  19. 建構子,一切的開頭。 - 建構子分為兩種,主要 (Primary) 建構子和次要 (Auxiliary) 建構子。 - 主要建構子定義於類別名稱後面,一個類別只能有一個 。參數裡面可以放置成員變數的宣告,同時作為宣告和 參數。 - 次要建構子定義於類別內部,使用construtor關鍵字定 義,一個類別可以有多個。必須呼叫其他次要建構子或 主要建構子。 型別的基礎:類別 (Class)
  20. class Position(val x: Int, val y: Int) { constructor(pair: Pair<Int, Int>) : this(pair.first, pari.second) }
  21. 純資料,非常的純 - 資料類別使用data class兩個關鍵字組合定義。 - 概念同類別,差別在於需要至少一個成員變數定義於主 要建構子內部,且不能有非成員變數定義的參數位於其 內部。 純資料型別:資料類別 (Data Class)
  22. data class Position(val x: Int, val y: Int)
  23. 使用的好壞取決於使用的情境 - 資料類別的比較是基於主要建構子內的變數宣告;類別 則是基於實例個別的雜湊值 (hashcode)來比較。 - 資料類別在輸出時會輸出完整的資料結構;類別則是輸 出實例的雜湊值。 資料類別 v.s. 類別
  24. 何謂Singleton? - Singleton,中譯單一實例,意即只有一個實例。 - 單一實例在特定情況下能避免權責分配不明確的問題。 - E.g. 如果要建立一個二維圖,那麼就不會使用類別,而 是使用物件類別。因為二維圖不可能有多個。 物件類別:Object
  25. 唯一、獨一。 - 物件類別不能有建構子。 - 要存取物件類別的實例直接寫類別名稱即可。 - 基本上所有成員都可以視為伴生 (或靜態) 的狀態。 物件類別:Object
  26. object TwoDimensionMap { val positions: MutableList<Position> = mutableListOf() }
  27. 唯一、獨一、且伴生。 - 伴生物件類別不能有建構子。 - 要存取伴生物件類別的實例直接寫伴生的對象類別名稱 即可。 - 基本上所有成員都可以視為伴生 (或靜態) 的狀態。 伴生物件類別:Companion Object
  28. class Position(val x: Int, val y: Int) { companion object { fun fromInts(x: Int, y: Int): Postiion { return Position(x, y) } } }
  29. 繁多不及備載 - Array:無法擴充的陣列。 - ArrayDeque:可以擴充的陣列,可以從頭尾或指定索引值 新增 / 刪除元素。 - List:無法擴充的列表。 - MutableList:可以擴充的列表,只能從尾端或指定索引值 新增 / 刪除元素。 - LinkedList:可以擴充的列表,可以從頭尾或指定索引值新 增 / 刪除元素。 常用資料結構
  30. 繁多不及備載 - Map:無法擴充的鍵值表。 - MutableMap:可以擴充的鍵值表。 - HashMap:可以擴充的鍵值表,以雜湊值儲存,無排序。 - LinkedHashMap:可以擴充的鍵值表,以雜湊值儲存, 根據插入的先後順序排序。 - TreeMap:可以擴充的鍵值表,以樹的形式儲存, 根據自然排序做排序。 常用資料結構
  31. 繁多不及備載 - Set:無法擴充的集合。 - MutableSet:可以擴充的集合。 - HashSet:可以擴充的集合,以雜湊值儲存,無排序。 - TreeSet:可以擴充的集合,以樹的形式儲存, 根據自然排序做排序。 常用資料結構
  32. 以上型別皆可繼承,Q.E.D. - 類別可以繼承: - 0~1個類別 - 0~N個介面 - 要被繼承需要有open、sealed、abstract其中一個關鍵字 。 - 資料類別可以繼承: - 0~1個類別 - 0~N個介面 - 無法被繼承 加碼:型別繼承:Inheritance
  33. 以上型別皆可繼承,Q.E.D. - 物件類別 / 伴生物件類別可以繼承: - 0~1個類別 - 0~N個介面 - 無法被繼承 - 介面可以繼承: - 0個類別 - 0~N個介面 - 可以被其他任意介面、類別、資料類別、伴生物件繼承。 加碼:型別繼承:Inheritance
  34. Leetcode - 100. Same Tree - 給定兩個二元樹的起始節點,請判斷兩個樹是否完全相等。 - 請在不更動以下的程式碼為前提解題。 - 提示:使用物件類別!! Wrap up - 挑戰時間! 進階挑戰!
  35. class Solution { // 提示:在這裡定義資料型別Node fun isSameTree(p: TreeNode?, q: TreeNode?): Boolean { val left = Node.fromTreeNode(p) val right = Node.fromTreeNode(q) return left == right } }
Anúncio