狠狠撸

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

More Related Content

Similar to GDSC FCU 第2堂 Kotlin (20)

[圣思园][Java SE]Java se lesson 3
[圣思园][Java SE]Java se lesson 3[圣思园][Java SE]Java se lesson 3
[圣思园][Java SE]Java se lesson 3
ArBing Xie
?
2011中正資管學術部講座 Java-Object
2011中正資管學術部講座 Java-Object2011中正資管學術部講座 Java-Object
2011中正資管學術部講座 Java-Object
Veck Hsiao
?
闯补惫补面试笔试题大汇总
闯补惫补面试笔试题大汇总闯补惫补面试笔试题大汇总
闯补惫补面试笔试题大汇总
yiditushe
?
闯补惫补面试知识
闯补惫补面试知识闯补惫补面试知识
闯补惫补面试知识
yiditushe
?
10, inner classes
10, inner classes10, inner classes
10, inner classes
ted-xu
?
闯补惫补程序员面试之葵花宝典
闯补惫补程序员面试之葵花宝典闯补惫补程序员面试之葵花宝典
闯补惫补程序员面试之葵花宝典
yiditushe
?
闯补惫补基础方面
闯补惫补基础方面闯补惫补基础方面
闯补惫补基础方面
yiditushe
?
Java7 fork join framework and closures
Java7 fork join framework and closuresJava7 fork join framework and closures
Java7 fork join framework and closures
wang hongjiang
?
2. java introduction
2. java introduction2. java introduction
2. java introduction
netdbncku
?
Scala function-and-closures
Scala function-and-closuresScala function-and-closures
Scala function-and-closures
wang hongjiang
?
颁濒辞箩耻谤别介绍与应用
颁濒辞箩耻谤别介绍与应用颁濒辞箩耻谤别介绍与应用
颁濒辞箩耻谤别介绍与应用
Robert Hao
?
滨翱厂入门分享
滨翱厂入门分享滨翱厂入门分享
滨翱厂入门分享
zenyuhao
?
[圣思园][Java SE]Java se lesson 1
[圣思园][Java SE]Java se lesson 1[圣思园][Java SE]Java se lesson 1
[圣思园][Java SE]Java se lesson 1
ArBing Xie
?
[圣思园][Java SE]Java se lesson 1
[圣思园][Java SE]Java se lesson 1[圣思园][Java SE]Java se lesson 1
[圣思园][Java SE]Java se lesson 1
ArBing Xie
?
Collection
CollectionCollection
Collection
Medivh2011
?
Java SE 7 技術手冊投影片第 15 章 - 反射器與類別載入器
Java SE 7 技術手冊投影片第 15 章 - 反射器與類別載入器Java SE 7 技術手冊投影片第 15 章 - 反射器與類別載入器
Java SE 7 技術手冊投影片第 15 章 - 反射器與類別載入器
Justin Lin
?
潜力无限的编程语言闯补惫补蝉肠谤颈辫迟
潜力无限的编程语言闯补惫补蝉肠谤颈辫迟潜力无限的编程语言闯补惫补蝉肠谤颈辫迟
潜力无限的编程语言闯补惫补蝉肠谤颈辫迟
jay li
?
Ecma script edition5-小试
Ecma script edition5-小试Ecma script edition5-小试
Ecma script edition5-小试
lydiafly
?
大公司的闯补惫补面试题集
大公司的闯补惫补面试题集大公司的闯补惫补面试题集
大公司的闯补惫补面试题集
yiditushe
?
[圣思园][Java SE]Java se lesson 3
[圣思园][Java SE]Java se lesson 3[圣思园][Java SE]Java se lesson 3
[圣思园][Java SE]Java se lesson 3
ArBing Xie
?
2011中正資管學術部講座 Java-Object
2011中正資管學術部講座 Java-Object2011中正資管學術部講座 Java-Object
2011中正資管學術部講座 Java-Object
Veck Hsiao
?
闯补惫补面试笔试题大汇总
闯补惫补面试笔试题大汇总闯补惫补面试笔试题大汇总
闯补惫补面试笔试题大汇总
yiditushe
?
闯补惫补面试知识
闯补惫补面试知识闯补惫补面试知识
闯补惫补面试知识
yiditushe
?
10, inner classes
10, inner classes10, inner classes
10, inner classes
ted-xu
?
闯补惫补程序员面试之葵花宝典
闯补惫补程序员面试之葵花宝典闯补惫补程序员面试之葵花宝典
闯补惫补程序员面试之葵花宝典
yiditushe
?
闯补惫补基础方面
闯补惫补基础方面闯补惫补基础方面
闯补惫补基础方面
yiditushe
?
Java7 fork join framework and closures
Java7 fork join framework and closuresJava7 fork join framework and closures
Java7 fork join framework and closures
wang hongjiang
?
2. java introduction
2. java introduction2. java introduction
2. java introduction
netdbncku
?
Scala function-and-closures
Scala function-and-closuresScala function-and-closures
Scala function-and-closures
wang hongjiang
?
颁濒辞箩耻谤别介绍与应用
颁濒辞箩耻谤别介绍与应用颁濒辞箩耻谤别介绍与应用
颁濒辞箩耻谤别介绍与应用
Robert Hao
?
滨翱厂入门分享
滨翱厂入门分享滨翱厂入门分享
滨翱厂入门分享
zenyuhao
?
[圣思园][Java SE]Java se lesson 1
[圣思园][Java SE]Java se lesson 1[圣思园][Java SE]Java se lesson 1
[圣思园][Java SE]Java se lesson 1
ArBing Xie
?
[圣思园][Java SE]Java se lesson 1
[圣思园][Java SE]Java se lesson 1[圣思园][Java SE]Java se lesson 1
[圣思园][Java SE]Java se lesson 1
ArBing Xie
?
Java SE 7 技術手冊投影片第 15 章 - 反射器與類別載入器
Java SE 7 技術手冊投影片第 15 章 - 反射器與類別載入器Java SE 7 技術手冊投影片第 15 章 - 反射器與類別載入器
Java SE 7 技術手冊投影片第 15 章 - 反射器與類別載入器
Justin Lin
?
潜力无限的编程语言闯补惫补蝉肠谤颈辫迟
潜力无限的编程语言闯补惫补蝉肠谤颈辫迟潜力无限的编程语言闯补惫补蝉肠谤颈辫迟
潜力无限的编程语言闯补惫补蝉肠谤颈辫迟
jay li
?
Ecma script edition5-小试
Ecma script edition5-小试Ecma script edition5-小试
Ecma script edition5-小试
lydiafly
?
大公司的闯补惫补面试题集
大公司的闯补惫补面试题集大公司的闯补惫补面试题集
大公司的闯补惫补面试题集
yiditushe
?

More from FCUGDSC (6)

GDSC FCU 第1堂 前端新手村 - HTML, CSS, JavaScript介紹
GDSC FCU 第1堂 前端新手村 - HTML, CSS, JavaScript介紹GDSC FCU 第1堂 前端新手村 - HTML, CSS, JavaScript介紹
GDSC FCU 第1堂 前端新手村 - HTML, CSS, JavaScript介紹
FCUGDSC
?
GDSC FCU 第3堂 Flutter
GDSC FCU 第3堂 FlutterGDSC FCU 第3堂 Flutter
GDSC FCU 第3堂 Flutter
FCUGDSC
?
GDSC FCU 第2堂 Flutter
GDSC FCU 第2堂 FlutterGDSC FCU 第2堂 Flutter
GDSC FCU 第2堂 Flutter
FCUGDSC
?
flutter installation.pptx
flutter installation.pptxflutter installation.pptx
flutter installation.pptx
FCUGDSC
?
flutter introduction .pptx
flutter introduction .pptxflutter introduction .pptx
flutter introduction .pptx
FCUGDSC
?
GDSC FCU 第1堂 Kotlin
GDSC FCU 第1堂 KotlinGDSC FCU 第1堂 Kotlin
GDSC FCU 第1堂 Kotlin
FCUGDSC
?
GDSC FCU 第1堂 前端新手村 - HTML, CSS, JavaScript介紹
GDSC FCU 第1堂 前端新手村 - HTML, CSS, JavaScript介紹GDSC FCU 第1堂 前端新手村 - HTML, CSS, JavaScript介紹
GDSC FCU 第1堂 前端新手村 - HTML, CSS, JavaScript介紹
FCUGDSC
?
GDSC FCU 第3堂 Flutter
GDSC FCU 第3堂 FlutterGDSC FCU 第3堂 Flutter
GDSC FCU 第3堂 Flutter
FCUGDSC
?
GDSC FCU 第2堂 Flutter
GDSC FCU 第2堂 FlutterGDSC FCU 第2堂 Flutter
GDSC FCU 第2堂 Flutter
FCUGDSC
?
flutter installation.pptx
flutter installation.pptxflutter installation.pptx
flutter installation.pptx
FCUGDSC
?
flutter introduction .pptx
flutter introduction .pptxflutter introduction .pptx
flutter introduction .pptx
FCUGDSC
?
GDSC FCU 第1堂 Kotlin
GDSC FCU 第1堂 KotlinGDSC FCU 第1堂 Kotlin
GDSC FCU 第1堂 Kotlin
FCUGDSC
?

GDSC FCU 第2堂 Kotlin