Kotlin 主要知識點概況

認識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
    頂層函數
  • 理解
  1. kotlin 我理解爲定義在類體外的
  2. C++ 全局函數
  3. 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高級

設計原則

  • 開發封閉原則
    含義:軟件實體可以擴展,但是不可以修改
    應用
  • 類擴展
  • 設計模式
    工廠模式
    伴生對象
    內聯函數
    響應式編程
    併發
    同步與異步
    多線程
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章