一、基礎(chǔ)語法
1搞莺、var息罗、val變量定義;val不可修改類似final才沧;
var <變量名> :<類型> = <初始化值>
val <變量名> :<類型> = <初始化值>
如下定義:
var name : String = “abc”
其中可以直接省略 類型迈喉,如:var name = "abc" // 類型推導(dǎo)
2、Fun函數(shù)定義温圆;
與java不同的點(diǎn)挨摸,fun函數(shù)可以在類外定義函數(shù);
Unit相當(dāng)于java的 void返回岁歉,可以不寫得运,默認(rèn)返回Unit(Void)
fun main():Unit{
}
具有返回值的例子:
fun:add(num1 : Int, num2 : Int): Int{
return num1 + num2
}
fun:add2(num1:Int,num2:Int) = num1 + num2 //使用類型推導(dǎo),推導(dǎo)出返回值為Int
可變參數(shù)、可變長的參數(shù)
fun:method(vararg value : Int){
for( i :Int in value){
println(i)
}
}
lambda 表達(dá)式函數(shù)
var method : (Int,Int) -> Int = {num1,num2 - > num1+ num2}
var res:int= method(1,1)
3熔掺、String 使用
val name = “abc”
val age = 22
println(“name$name, age$age”)//使用美元符號$拼接字符串
//換行,三個引號換行; .trimIndent() 函數(shù)去掉前置空格饱搏;
val info = """
AAAAAA
BBBBBB
""".trimIndent()
4、Null機(jī)制檢查
var name:String?=null
name?.length //如果為null不執(zhí)行置逻,不會發(fā)生空指針異常
name!!.length //如果為null推沸,發(fā)送空指針異常
//Int? 返回類型,可以返回null
fun:test(name:String):Int?{
}
//三目運(yùn)算符
var info:String?=null
info?.length ?: "info為null"
5券坞、in 區(qū)間
for(i:int in 1..9){
}
for(i:int downTo 9..1){
}
in 其中只可以從小到大鬓催;downTo 是從大到小恨锚;
用in區(qū)間做判斷深浮,如:var value = 2;if(value in 1..100)
指定間隔 step眠冈, 如:for(i:int in 1..20 step 2),間隔2循環(huán)數(shù)組1-20的數(shù)
用于排除until菌瘫,如:for(i : int in 1 until 10)蜗顽,排除10,輸出1到9的數(shù)
二雨让、比較和數(shù)組
1雇盖、比較
比較兩個值
val name1 = “Alice”
val name2 = “Alice”
name1.equals(name2) //true 不推薦這樣寫,而是推薦使用==
name1 == name2 //true
比較對象地址栖忠,使用三個等號===
val name1 = “Alice”
val name2 = “Alice”
name1 === name2 // 輸出:false
2崔挖、數(shù)組
第一種模式
val nums : Array<Int> = arrayOf(1,2,3,4,5)
println(nums[0])
第二種模式,20個size,value = 0開始value取值0庵寞、20狸相,然后每個value + 1001,
val nums:Array<Unit> = Array(20,{value:Int -> (value + 1001)} )
三捐川、條件控制
if 是屬于表達(dá)式脓鹃,具有返回值瘸右。
val max : Int = if(num1 > num2) num1 else num2 // 表達(dá)式比較大小
val max :Int = if(num1 > num2){
//TODO ....代碼
num1
}else{
//TODO ....代碼
num2
}
switch 的寫法太颤,同時 when也具有返回值
基礎(chǔ)寫法
val num = 11
when(num){
1->println("一")
11->println("十一")
else ->println("else")
}
//具有返回值寫法
val num = 11
val str : String = when(num){
1->{
println("一")
"一"
}
11-> {
println("十一")
"十一"
}
else -> {
println("else")
"else"
}
}
四、循環(huán)和標(biāo)簽
標(biāo)簽 xxx@ 自定義的標(biāo)簽
class 類 系統(tǒng)會自帶一個標(biāo)簽,如 class Person{} this@Person
循環(huán)
var items :List<String> = listOf<String>("a","b","c")
for(item in items){
println(item)
}
items.forEach{
println(it)
}
遍歷,打印下標(biāo)
for(index in items.indices){
println("下標(biāo):$index , 對應(yīng)的值:${items[index]}")
}
五、類與對象
類 默認(rèn)是public ,可以不需要添加public
空類廊蜒,可以不需要{}
定義空類:
class Empty
構(gòu)造函數(shù)(class類需要添加open修飾才可以被繼承)
主構(gòu)造函數(shù)屁倔、次構(gòu)造函數(shù)
open class Person(id : Int){ // 主構(gòu)造
constructor(id : Int , name : String) : this(id){ // 次構(gòu)造必須引入主構(gòu)造 :this(id)
}
//構(gòu)造函數(shù)重載
constructor(id :Int , sex : Char): this(id){
}
//無參構(gòu)造函數(shù)
constructor(): this(12){
}
}
定義對象,不能使用new
var p = Person() //調(diào)用無參構(gòu)造
繼承和實(shí)現(xiàn) 使用:繼承钞翔。class類需要添加open修飾才可以被繼承
class Student (id : Int): Person( id){
}
定義類的成員變量
class Student (id : Int): Person( id){
lateinit var name : String // lateinit 懶加加載初始化俺亮,kotlin中全部無默認(rèn)值
var age :Int = 0
}
抽象類 與 接口
接口,默認(rèn)都是open 修飾
interface Callback{
}
抽象類
abstract Person :Callback{ //多個接口鲁冯,只需要用 逗號, 隔開
abstract fun getId() : Int
abstract fun initView() : Unit //返回空跨扮,可以不寫 : Unit
}
實(shí)現(xiàn)抽象類和接口
class Student :Person(){ //繼承必須需要加() 表示是構(gòu)造函數(shù)
override fun getId() : Int = 33
override fun initView() { }
}
data 定義數(shù)據(jù)類(實(shí)體Bean)璃氢;其中:data 字段的使用塘秦,可以快捷生成javaBean類
data class User(val id : Int, var name :String , val sex : Char)
//使用數(shù)據(jù)類(實(shí)體bean)‘
val user = User(11,"Alice","F")
克隆、復(fù)制
val(xId,xName,xSex) = user.copy()
println("xId:$xid 钉赁,xName:$xname你踩,xSex:$xSex")
//拒絕復(fù)制, 使用下劃線 _
val(_诅岩,xName吩谦,xSex) = user.copy()
println("xId:$xid ,xName:$xname逛绵,xSex:$xSex")
單例 ,使用object字段修飾
object Person{
fun test(){
}
}
//使用
Person.test()
單例模式寿酌,demo
class Test{
object Holder{
var instance = Test()
}
//使用派生companion object硕并,實(shí)現(xiàn)static
companion object{
//在派生中寫的代碼邏輯,全部屬于靜態(tài)的
fun getInstance() : Test { // 簡寫: fun getInstance() : Test = Holder.instance
return Holder.instance
}
}
}
//使用
fun main(){
var test : Test = Test.getInstance()
}
內(nèi)部類必須使用inner 修飾秧荆,若沒有inner倔毙,則是屬于嵌套類,嵌套類不能訪問外部類的成員
class Test{
class Holder{ // 嵌套類
}
inner class Holder{ // 內(nèi)部類
}
}