SlideShare ist ein Scribd-Unternehmen logo
1 von 35
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 Exception,簡稱NPE
- 當要存取 (access) 成員變數 / 呼叫 (invoke) 函式時,如
果物件的實際值是空值,那麼JVM就會拋出 (throw) NPE
,全名 Null Pointer Exception。
- NPE致命之處在於跟C/C++的Segment Fault一樣,若沒
有適當處理整個程式會直接終止。
可空型別:Nullable Type
Null Pointer Exception,簡稱NPE
可空型別: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
}
}

Weitere ähnliche Inhalte

Ähnlich wie GDSC FCU 第2堂 Kotlin

[圣思园][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
 
Java面试笔试题大汇总
Java面试笔试题大汇总Java面试笔试题大汇总
Java面试笔试题大汇总
yiditushe
 
Java面试知识
Java面试知识Java面试知识
Java面试知识
yiditushe
 
Java程序员面试之葵花宝典
Java程序员面试之葵花宝典Java程序员面试之葵花宝典
Java程序员面试之葵花宝典
yiditushe
 
Java基础方面
Java基础方面Java基础方面
Java基础方面
yiditushe
 
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
 
[圣思园][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
 
基于原型的JavaScript面向对象编程
基于原型的JavaScript面向对象编程基于原型的JavaScript面向对象编程
基于原型的JavaScript面向对象编程
zhangdaiping
 
潜力无限的编程语言Javascript
潜力无限的编程语言Javascript潜力无限的编程语言Javascript
潜力无限的编程语言Javascript
jay li
 
Ecma script edition5-小试
Ecma script edition5-小试Ecma script edition5-小试
Ecma script edition5-小试
lydiafly
 

Ähnlich wie GDSC FCU 第2堂 Kotlin (20)

Sun java
Sun javaSun java
Sun java
 
[圣思园][Java SE]Java se lesson 3
[圣思园][Java SE]Java se lesson 3[圣思园][Java SE]Java se lesson 3
[圣思园][Java SE]Java se lesson 3
 
2011中正資管學術部講座 Java-Object
2011中正資管學術部講座 Java-Object2011中正資管學術部講座 Java-Object
2011中正資管學術部講座 Java-Object
 
Java面试笔试题大汇总
Java面试笔试题大汇总Java面试笔试题大汇总
Java面试笔试题大汇总
 
Java面试知识
Java面试知识Java面试知识
Java面试知识
 
10, inner classes
10, inner classes10, inner classes
10, inner classes
 
Java程序员面试之葵花宝典
Java程序员面试之葵花宝典Java程序员面试之葵花宝典
Java程序员面试之葵花宝典
 
Java基础方面
Java基础方面Java基础方面
Java基础方面
 
Java7 fork join framework and closures
Java7 fork join framework and closuresJava7 fork join framework and closures
Java7 fork join framework and closures
 
2. java introduction
2. java introduction2. java introduction
2. java introduction
 
Scala function-and-closures
Scala function-and-closuresScala function-and-closures
Scala function-and-closures
 
Clojure简介与应用
Clojure简介与应用Clojure简介与应用
Clojure简介与应用
 
IOS入门分享
IOS入门分享IOS入门分享
IOS入门分享
 
[圣思园][Java SE]Java se lesson 1
[圣思园][Java SE]Java se lesson 1[圣思园][Java SE]Java se lesson 1
[圣思园][Java SE]Java se lesson 1
 
[圣思园][Java SE]Java se lesson 1
[圣思园][Java SE]Java se lesson 1[圣思园][Java SE]Java se lesson 1
[圣思园][Java SE]Java se lesson 1
 
Collection
CollectionCollection
Collection
 
Java SE 7 技術手冊投影片第 15 章 - 反射器與類別載入器
Java SE 7 技術手冊投影片第 15 章 - 反射器與類別載入器Java SE 7 技術手冊投影片第 15 章 - 反射器與類別載入器
Java SE 7 技術手冊投影片第 15 章 - 反射器與類別載入器
 
基于原型的JavaScript面向对象编程
基于原型的JavaScript面向对象编程基于原型的JavaScript面向对象编程
基于原型的JavaScript面向对象编程
 
潜力无限的编程语言Javascript
潜力无限的编程语言Javascript潜力无限的编程语言Javascript
潜力无限的编程语言Javascript
 
Ecma script edition5-小试
Ecma script edition5-小试Ecma script edition5-小试
Ecma script edition5-小试
 

Mehr von FCUGDSC

Mehr von 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介紹
 
GDSC FCU 第3堂 Flutter
GDSC FCU 第3堂 FlutterGDSC FCU 第3堂 Flutter
GDSC FCU 第3堂 Flutter
 
GDSC FCU 第2堂 Flutter
GDSC FCU 第2堂 FlutterGDSC FCU 第2堂 Flutter
GDSC FCU 第2堂 Flutter
 
flutter installation.pptx
flutter installation.pptxflutter installation.pptx
flutter installation.pptx
 
flutter introduction .pptx
flutter introduction .pptxflutter introduction .pptx
flutter introduction .pptx
 
GDSC FCU 第1堂 Kotlin
GDSC FCU 第1堂 KotlinGDSC FCU 第1堂 Kotlin
GDSC FCU 第1堂 Kotlin
 

GDSC FCU 第2堂 Kotlin