一、定義常量/變量
val? 定義常量? getter
var? 定義變量? setter? getter
lateinit? 和 var配合使用,表示可以延遲初始化的變量;基礎(chǔ)數(shù)據(jù)類型和val修飾的變量不能使用;
「Kotlin 的基本數(shù)值類型包括 Byte、Short、Int、Long、Float、Double 等。不同于Java的是,字符不屬于數(shù)值類型,是一個獨立的數(shù)據(jù)類型」
注意: ? 定義變量,表示可以為空;? eg: var name: String? = ""
? ? ? 變量后邊,表示如果變量為空則不處理; eg:name?.length
? ? !! 變量后邊,表示變量必然不能為空,如果為空則會拋出空指針異常;eg: name!!.length
訪問權(quán)限修飾符:
private? 只在本文件可見;
protected? 同一個文件和子類中可見;
public? ? 所有調(diào)用的地方都可見;
internal? 同一個模塊中可見,表示這個類方法只適合當前module使用。
二、定義類
class/final class? ? 定義一般類,默認定義類都是final 類;
open? class? 定義可以繼承的類,可以繼承類的中函數(shù)如果需要重寫也需要添加open
abstract class? 定義抽象類,
enum? class? 枚舉類
object? 靜態(tài)類,方法和變量都是靜態(tài)的;
「衍生:companion? object? 修飾為伴生對象,伴生對象在類中只能存在一個,類似于java中的靜態(tài)方法 Java 中使用類訪問靜態(tài)成員,靜態(tài)方法。相當于一個靜態(tài)區(qū)域」
inner class? 內(nèi)部類;內(nèi)部類中調(diào)用外部 eg:this@Outer.param
data? class? 數(shù)據(jù)類;
為了保證生成代碼的一致性以及有意義,數(shù)據(jù)類需要滿足以下條件:
主構(gòu)造函數(shù)至少包含一個參數(shù)。
所有的主構(gòu)造函數(shù)的參數(shù)必須標識為val 或者 var ;
數(shù)據(jù)類不可以聲明為 abstract, open, sealed 或者 inner;
數(shù)據(jù)類不能繼承其他類 (但是可以實現(xiàn)接口)
sealed class? 密封類,不能直接實例化,只能實例化子類;
構(gòu)造函數(shù):
主構(gòu)造函數(shù):寫到類名后邊? eg: class? object(var name:String)
主構(gòu)造器中不能包含任何代碼,初始化代碼可以放在初始化代碼段中,初始化代碼段使用 init 關(guān)鍵字作為前綴。
次構(gòu)造函數(shù):類也可以有二級構(gòu)造函數(shù),需要加前綴 constructor;
三、定義接口
interface?
允許方法有默認實現(xiàn),
接口中的屬性只能是抽象的,不允許初始化值,接口不會保存屬性值,實現(xiàn)接口時,必須重寫屬性;
四、Lambda表達式
這是Lambda表達式最完整的語法結(jié)構(gòu)。
{參數(shù)名1:參數(shù)類型,參數(shù)名2:參數(shù)類型 -> 函數(shù)體}
() -> Unit//表示無參數(shù)無返回值的Lambda表達式類型
(T) -> Unit//表示接收一個T類型參數(shù),無返回值的Lambda表達式類型
(T) -> R//表示接收一個T類型參數(shù),返回一個R類型值的Lambda表達式類型
(T, P) -> R//表示接收一個T類型和P類型的參數(shù),返回一個R類型值的Lambda表達式類型
(T, (P,Q) -> S) -> R//表示接收一個T類型參數(shù)和一個接收P、Q類型兩個參數(shù)并返回一個S類型的值的Lambda表達式類型參數(shù),返回一個R類型值的Lambda表達式類型
1、首先最外層一對大括號。
2、如果有參數(shù)傳入Lambda表達式,我們還需要聲明參數(shù)列表。
3、參數(shù)列表的結(jié)尾使用->符號,表示參數(shù)列表的結(jié)束以及函數(shù)體的開始,函數(shù)體中代碼長度不限
4、Lambda表達式最后一行代碼表示Lambda表達式的返回值。
? eg: val maxLengthFruit = list.maxBy({ fruit: String -> fruit.length })
5、當Lambda是函數(shù)的最后一個參數(shù)時,可以將Lambda表達式移到函數(shù)的括號外面。
? eg: val maxLengthFruit = list.maxBy(){ fruit: String -> fruit.length }
6、如果Lambda是函數(shù)的唯一參數(shù)的話,可以省略函數(shù)的括號。
? eg: val maxLengthFruit = list.maxBy{ fruit: String -> fruit.length }
7、由于Kotlin擁有出色的類型推導(dǎo)機制,所以Lambda的參數(shù)列表大多數(shù)情況下不需要聲明參數(shù)類型
? eg: val maxLengthFruit = list.maxBy{ fruit -> fruit.length }
8、Lambda表達式只有一個參數(shù)時,也沒必要聲明參數(shù)名稱,可以用it代替。
? eg: val maxLengthFruit = list.maxBy{ it.length }
五、高階函數(shù)
高階函數(shù)即指:將函數(shù)用作一個函數(shù)的參數(shù)或者返回值的函數(shù)。
eg:? ? fun hightFun(x: Int, y: (Int,Int) -> Int){}