認識Kotlin
Java && Kotlin 區別
幾個觀念
Kotlin -> “更好的Java”
Java和kotlin平行關係,最終都翻譯爲Class文件
幾個問題點
Java 一切方法和屬性 盡在類中 - Kotlin 也這樣嗎? if No 導致了什麼??
頂層函數
Kotlin 取消Static 而引入 Object
Java的靜態屬性
Kotlin的伴生對象
根類爲什麼不同!? Object 與 Any
方法對比
Kotlin
Java
區別在哪裏?
爲什麼這些方法是必須的?
equals 等價關係:自反性,對稱性,傳遞性,一致性,與null比較
hashCode:唯一標示這個對象,返回hash值
toString:返回這種形式 ToStringExample@4554617c ,@後面的爲散列碼
泛型
kotlin 擴展函數 & Java靜態函數
類型系統
類型推導
kotlin引入特殊類
data class
inner class
kotlin <==> Java 轉換
Code –> Convert Java File To Kotlin File
Tools –> Kotlin –> Show Kotlin Bytecode - Decompile
基礎語法
基本數據類型
- float:f,F後綴
- 布爾:Boolean(true,false)
- 數組 array 創建 arrayOf
- 字符:char 不能直接與數字操作,char必須是單引號 如:‘a’
- 字符串String:$ 字符串模式引用變量或者表達式
特性
裝箱機制 :kotlin 內置類型 -> JVM原生類型
其它(可空引用,泛型) -> 自動裝箱成相應的包裝類
== && === 類型相等性
變量,屬性,字段
- 屬性:str.length 爲什麼沒有( )(最直觀的理解)有函數的意味在裏面
val 不可變 only getter
var 可變 getter 和 setter
特性:可執行默認初始化 - 委託屬性
聲明:val/var : by
延遲屬性(lazy properties): 其值只在首次訪問時計算 - 懶加載屬性
prop$delegate 屬性:自動生成,並複寫prop的setter和getter方法
可觀察屬性(observable properties): 監聽器會收到有關此屬性變更的通知
storing:把多個屬性儲存在一個映射(map)中,而不是每個存在單獨的字段中 - 使用場景:被模型的屬性全部委託到map的結構去真實存儲數據
用於解析json,或者做一些動態的事情
變量
字段
程序結構
- 循環
for( it in collection ) { //對象需提供迭代器 }
提供下標 for ( index in collection.indices)
while && do…while
跳轉key:return ,break,continue - 判斷
if … else
when(x) { } : 相當於switch case x - 類型聲明
類型推導/轉換
toByte(): Byte toShort(): Short toInt(): Int toLong(): Long toFloat(): Float toDouble(): Double toChar(): Char
Java & kotlin 相互調用
方法調用
Java返回void - kotlin返回Unit
類
獲取對象的引用:val c = myObj::class
關鍵字:kotlin - Java ‘’轉義
註解
@JvmName:包級屬性和函數
@JvmField:kotlin屬性 - Java 中的一個域
@JvmStatic:kotlin - Java 生成靜態方法
屬性
Java setter & getter 方法 - kotlin 屬性
類型系統
空安全 & 平臺類型
映射類型:Java 映射到對應的 kotlin類型
映射發生在編譯期間,運行時表示保存不變
kotlin fun
fun 那些事兒
- 擴展函數:在類體外定義 class. fun name( ) :returnValue { this -> 代指 調用的對象 }
- 接受器類型:任何擴展類&接口 接受器對象:擴展函數的值
- 標準庫擴展函數
run
let
also
takeif
內聯函數 inline
頂層函數 - 理解
- kotlin 我理解爲定義在類體外的
- C++ 全局函數
- Java 的靜態函數 Kt->Java 創建一個類(類名即文件名),+public static 修飾方法
lambda
表達式:{ a,b -> a+b} 參數類型,返回值類型
key含義
this 代表調用函數的對象
it 指的是iterator 只有一個參數時可默認爲it
函數式編程
定義:輸入(引數)— 輸出(傳出值)編程範式
特性
函數即輸入與輸出的關係,不關心過程,只重結果
stateless:函數不維護任何狀態
immutable:輸入數據不能動,返回新的數據集
lambda 最少樣板代碼傳遞代碼塊
lambda = 匿名函數
高階函數:使用函數對象作爲參數或返回值
fun 鏈式調用 (funA().funB():相應funA的返回值去調用funB)
函數式操作
filter 篩選
map 映射
reduce 歸約
groupBy 分組
面向對象
構造方法
主:
從:聲明在類體內以 constructor 關鍵字
特性:
必須帶constructor
次構造函數都需要用 this 關鍵字直接或間接委託給主構造函數
訪問控制: 權限修飾 public,private,protected
伴生對象:static到object
初始化:伴生對象的初始化是在相應的類被加載(解析)時,與 Java 靜態初始化器的語義相匹配
繼承,覆蓋
委託
聲明格式:by XXX
XXX將會在類內部存儲
編譯器將生成轉發給XXX所有的成員函數
泛型
Java中的泛型不型變:List 非 List 子類型
聲明處型變
out 型變註解
in
類型投影
類型擦除:運行時泛型實例不保留類型實參任何信息
類型安全檢測:僅在編譯期進行
多態
kotlin class 六大類型
抽象類
抽象方法:abstract fun name( ) 無實現
抽象屬性 abstract val name:String 不能初始化,子類必須初始化
特性:不能創建對象,子類必須實現抽象方法
數據類
聲明:data class (var a,var b . . .)
編譯器隱含:equals,hascode,toString
特性:至少一個參數,必須標val var ,可繼承,可實現接口
解構聲明:所定義的屬性,自動生成ComponentN()一一對應
copy() : 修改類屬性
package oop
data class DataClass(
var weight:Double,
var age:Int,
var name:String
)
fun main(args:Array<String>) {
val people1 = DataClass(60.0,22,"yerongrong")
val people2 = DataClass(65.0,22,"yerongrong.genius")
if(people1.equals(people2)) {
println("people1 = people2")
}else {
println("people1 = people2")
}
println("${people1.age},${people1.name},${people1.weight}")
people1.copy(age = 5)
println("${people1.age},${people1.name},${people1.weight}")
val (w,a,n) = people1
println("$w,$a,$n")
}
/**
* 1. 上面說明了數據類的聲明格式
* dataclass
*
* 2. 另外包括了一些高級用法
* copy()函數
* val (w,a,n) = people1 聲明屬性格式
* equals 原生對比方法
*/
字符串String
字符串String
特性: 支持[ ] 隨機訪問
fun 分類
index :indexof() 查找元素對應的下標(默認匹配第一個)
子串sub:
subsequence: startIndex參數:截取字符串的開始下標,endIndex參數:截取字符串的結束下標,rang參數,是指一個IntRang類型
附加:after,before,last
filter過濾:s.filter { 過濾的條件 }
轉換:toXXX 轉換成指定類型 如大整數,byteArray
replace: 替換串中的某部分,可指定條件
replace(XXX,XXX,ignoreCase = false) regex: 指定正則表達
replaceXXX: range 指定範圍,after,before,first
分割split
正則 Kotlin:regex Java: pattern
以delimiters作爲分割符:將string分爲多個sub串
集合
list
特性:List 是一個有序集合,可通過索引(反映元素位置的整數)訪問元素。元素可以在 list 中出現多次
- 常用fun
創建 listof(),mutablelistof() 可讀寫,listofnotnull () 非空的
類似於其它容器
set
特性:Set 是唯一元素的集合。它反映了集合(set)的數學抽象:一組無重複的對象。
- 常用fun
創建 setof(),mutablesetof() 可讀寫,sortedsetof() 排序的
元素操作:add,remove,clear(清空),isEmpty 判空,size 大小
排序:sortXXX
split分割
filter過濾
循環foreach
max / min
index
groupby分組
map
- 特性:Map(或者字典)是一組鍵值對。鍵是唯一的,每個鍵都剛好映射到一個值。值可以重複。邏輯連接
常用fun
創建mapof(x to x,xx to xx), mutableMapOf<key,value>()可讀寫,sortedmapof() 排序的
plus
關於集合
共有
繼承自同父類相同的屬性&方法:Collection
常用方法
循環 foreach
過濾 filter
接口類
接口:即一種約定,不能有狀態
聲明: interface name { }
方法:只能存在public abstract 方法,允許方法有默認實現
屬性
內部類
類可以嵌套在其它類內部
標記爲 inner 的嵌套類能夠訪問其外部類的成員
枚舉類
聲明:enum class name { }
枚舉常量:即枚舉類的對象,0-多個,以逗號分隔
特性
name(枚舉常量名)&& ordinal (枚舉常量位置)
默認實現了companion object {},無需實例化
訪問:valueOf( ) values( ) 和enumValues() enumValueOf()
密封類
密封類:不能被實例化,用來表示受限的類繼承結構
聲明:sealed class SealedExpr( )
特性
有限的代碼保護
子類只能聲明在本文件內
密封類的一個子類可以有可包含狀態的多個實例
元編程
反射
註解
註解是一種類型 : 相當於對於某些代碼個體的標籤,用於評價與解釋
定義:public @interface TestAnnotation { }
應用:@TestAnnotation public class Test { }
元註解:註解的註解 @Retention、@Documented、@Target、@Inherited、@Repeatable 5種
特性
註解通過反射獲取
註解只有屬性,即成員變量
提供信息給編譯器
編譯階段時的處理
運行時的處理
kotlin高級
設計原則
- 開發封閉原則
含義:軟件實體可以擴展,但是不可以修改
應用 - 類擴展
- 設計模式
工廠模式
伴生對象
內聯函數
響應式編程
併發
同步與異步
多線程