黃驊市網(wǎng)站建設(shè)價(jià)格新聞發(fā)布
1 變量
1.1 用法
Kotlin中的變量定義有2個(gè)關(guān)鍵字,val
和var
val用來定義不可變變量,第一次賦值后就不能再被修改了, var定義可變變量, 隨便修改。一個(gè)好的編程習(xí)慣是, 能用val的就不要用var, 原因是安全, 這也是Kotlin中強(qiáng)制讓你指明變量是否可變的原因。
針對變量定義, Kotlin有一個(gè)非常重要的機(jī)制, 類型自動(dòng)推導(dǎo), 那意味著可以告別C/C++, Java, 等語言中非常繁瑣的變量定義方法。
1.2 對比示例
上幾個(gè)例子感受一下這種變量定義的簡潔之處吧。
Kotlin定義方式:
val name = 'leo'
var age = 18
python定義方式:
name = 'leo'
age = 18
java定義方式:
string name = 'leo';
int age = 18;
簡潔性方面, 高下立判。 python yyds! Kotlin也還不錯(cuò)。 但這里不是為了比較不同編程語言, 僅僅是為 了對比加深印象。
上面的例子中, Kotlin就省略了類型定義, 其實(shí)是有編譯器自動(dòng)幫我們推導(dǎo)的。類型自動(dòng)推導(dǎo)可以滿足大多數(shù)的要求, 但有些場景類型是無法自動(dòng)推導(dǎo)出來的,比如延遲賦值等場景, 這個(gè)時(shí)候還是需要手動(dòng)指明變量類型的。如果需要手動(dòng)指明的話, 方法是在變量名后加: 變量類型
, 如:
val name : String = 'leo'
var age : Int = 18
寫法上還是比較自然的。
2 函數(shù)
編程中經(jīng)常會有函數(shù)和方法兩個(gè)術(shù)語, 其實(shí)兩者完全一樣, 沒有任何區(qū)別, 習(xí)慣叫法不同而已。
函數(shù)就是一堆代碼的集合,為了方便, 把多條代碼封裝在一起。
2.1 函數(shù)寫法
直接上個(gè)例子,對例子講解吧:
fun myFunc(name: String, age: Int) : Int{return 0
}
要點(diǎn)如下:
- 1 函數(shù)定義用關(guān)鍵字
fun
(function的縮寫) - 2
myFunc
是函數(shù)名, 建議起名遵循命名規(guī)范以及見名知意的原則 - 3 小括號中是函數(shù)可以接受的入?yún)?#xff0c;按照
變量名:變量類型
的格式書寫, 沒有入?yún)⒖梢钥罩粚?/li> - 4 小括號外的
:Int
定義了返回值類型, 同樣的, 沒有返回值也可以省略 - 5 {}中的是函數(shù)體, 也就是具體實(shí)現(xiàn)的代碼, 只有一行的話可以省略大括號。
2.2 對比示例
python寫法:
def myFunc(name, age):return 0
java寫法:
public static int myFunc(string name, int age){return 0;
}
3 條件語句
3.1 常規(guī)的if else
fun getScore(score: Int){if (score>80){print("Very good")}else if (score>60) {print("Good")}else {print("Bad")}
}
上面是常規(guī)的 if else 語句,比較簡單直觀,應(yīng)該不會過多講解。
3.2 簡潔而強(qiáng)大的when
when語句相當(dāng)于其他編程語言中的swith case 語句, 但是更加簡潔和強(qiáng)大。
fun getScore(score: Int){when(score) {80-> print("Very Good")60-> print("Good")else -> print("Bad")}
}
語法要點(diǎn)是, 在when中傳入一個(gè)任意類型的參數(shù), when的結(jié)構(gòu)體中定義一系列的條件, 格式是:
匹配值 -> {執(zhí)行邏輯}
。 當(dāng)執(zhí)行邏輯只有一句時(shí), 可以省略{}。 也就得到了上面代碼的寫法。
注意上面用when語句寫的代碼功能與上面用if else寫的不一樣。因?yàn)閣hen接收的是一個(gè)參數(shù), 而上面if else 中的條件是一個(gè)表達(dá)式。 那這時(shí)候就可以用無參數(shù)的when表達(dá)式了。
fun getScore(score: Int){when {score>80 -> print("Very Good")score>60 -> print("Good")else -> print("Bad")}
}
注意代碼的變化, 因?yàn)闊o參數(shù)傳入,when后面的括號不需要了, 表達(dá)式的計(jì)算放在when的結(jié)構(gòu)體里面。 這個(gè)代碼的功能就跟上面的if else定義的完全一致了。
4 循環(huán)語句
4.1 while循環(huán)
var index =5
while (index>0) {println(index)index --
}
輸出 5 4 3 2 1
var index =5
do {prinltn(index)index --}
while (index>0)
}
輸出 5 4 3 2 1
4.2 for循環(huán)
Kotlin的for in 循環(huán)與python非常類似, 基本語法是for (變量 in 可迭代對象)
, 可迭代對象包括數(shù)組, 列表等等。
for (index in 1..10)println(index)
上面的1…10是一個(gè)區(qū)間, 它是一個(gè)可迭代的對象。 ..
是創(chuàng)建兩端閉區(qū)間的關(guān)鍵字。 也就是說, 上面的區(qū)間是包含1和10的。 通常我們用的左閉右開區(qū)間多一些, 這個(gè)時(shí)候用until
, 1 until 10
, 就是1到9,不包括10。 還能通過step
控制步長, downTo
可以實(shí)現(xiàn)降序, 10 downTo 1
就是從10 到1.
for (index in 1..10 step 2)println(index)
5 類
類是面向?qū)ο缶幊讨凶钪匾母拍盍恕?/p>
5.1 類的定義
先上個(gè)示例:
class Person() {val name = "leo"val age = 18fun getInfo() {print("name is: $name , age is: $age.")}
}
fun main() {val person = Person()person.getInfo()
}
類的定義用關(guān)鍵字class
, Person
是類名, 括號中可以填入構(gòu)造方法的參數(shù),如果沒有參數(shù)可以為空, 但是括號不能省。 {}中的是類的實(shí)現(xiàn), 類中可以定義變量和函數(shù)。 在 val person = Person() 這句話是實(shí)例化一個(gè)對象。
上面是最簡單的類的定義方法。 其實(shí)是跟python比較相似的, 甚至比python還要簡潔一些。 為了加深印象, 看下python是怎么寫的:
class Person():def __init__():self.name = "leo"self.age = 18def getInfo():print(f"name is {self.name}, age is {self.age}.")
if __name__ = __main__:person = Person()person.getInfo()
上面代碼中的__init__
是python的構(gòu)造函數(shù),可以帶參數(shù),也可以不帶參數(shù), 上面的定義中就是不帶參數(shù)的。 Kotlin中也有init構(gòu)造函數(shù),而且跟python非常類似。
說幾點(diǎn)主要不同:
- Kotlin中的 Person(), 括號里面是傳入構(gòu)造參數(shù)的, 上面因?yàn)槲覀儧]有傳入?yún)?shù), 所以是空。而python Person() 括號中是填入被繼承的父類的, 至于構(gòu)造參數(shù)的是在
__init__
中。 - Kotlin中的 Person(), 括號里面是傳入構(gòu)造參數(shù)的,如果想在構(gòu)造這個(gè)類的時(shí)候還想有一些邏輯處理,那就需要寫init構(gòu)造函數(shù)了, 一般情況下都不需要。
5.2 類的繼承
最簡單的繼承語法是: class 類名():被繼承的父類()
如我們定義一個(gè)Student類繼承上面的Person類。
class Student(): Person(){fun getInfoNew() {getInfo()}
}
fun main() {val student = Student()student.getInfoNew()
}
輸出
name is: leo , age is: 18.
上面的例子中可以清晰地體現(xiàn)繼承, 繼承可以繼承到父類的變量和方法。
注意Kotlin的類默認(rèn)不能繼承, 要想能被繼承, 需要用open關(guān)鍵字修飾
上面的類都是不帶構(gòu)造參數(shù)的, 但是通常我們定義的類都是帶構(gòu)造參數(shù)的。 帶構(gòu)造參數(shù)的類定義稍微復(fù)雜一些, 如下:
open class Person(val name: String, val age: Int) {fun getInfo() {print("name is: $name , age is: $age.")}
}class Student(val sex: String, name: String, age:Int): Person(name, age){fun getInfoNew() {getInfo()}
}
fun main() {val student = Student("man", "leo",18)student.getInfoNew()
}
帶參數(shù)的類定義有以下幾點(diǎn)需要注意:
- 1 構(gòu)造參數(shù)需要用關(guān)鍵字val 或者var, 這點(diǎn)跟函數(shù)定義不同, 函數(shù)定義不需要這些關(guān)鍵字。
- 2 子類的構(gòu)造函數(shù)比較要調(diào)用父類的構(gòu)造函數(shù), 因?yàn)楦割怭erson有2個(gè)構(gòu)造參數(shù)name 和age, 所以子類定義中也必須帶上這2個(gè)參數(shù)。
5.3 數(shù)據(jù)類 data class
數(shù)據(jù)類算是一種特殊的類, 與一般的類相比,需要實(shí)現(xiàn)equals()、hashCode()、toString()這幾個(gè)方法。
數(shù)據(jù)類一般都是用來定義各種數(shù)據(jù)的, 用一個(gè)類來實(shí)現(xiàn)方便管理。
這幾個(gè)方法的實(shí)現(xiàn)實(shí)際上固定的模式。 所以Kotlin中已經(jīng)幫我們實(shí)現(xiàn)好了, 只需要簡單地加個(gè)data關(guān)鍵字就可以了。
data class myData(val brand:String, val price :Int)
fun main() {var mydata = myData("Apple", 5999)var mydata1 = myData("Huawei", 4999)println(mydata)println("mydata equal to mydata1: ${mydata==mydata1}")
}
輸出:
myData(brand=Apple, price=5999)
mydata equal to mydata1: false
注意上面的 == 判斷調(diào)用的就是equals() 方法。
5.4 單例類 object
單例類也是一種特殊的類, 單例類的對象在全局只能存在一個(gè)。 在Kotlin中定義單例類非常簡單, 把class關(guān)鍵字換成object就可以了。
object Singleton {fun func1(){println("this is singleton")}
}fun main() {Singleton.func1()
}
單例類沒有構(gòu)造函數(shù),因此Singleton后面不帶()。
調(diào)用單例類的方法跟其他語言中調(diào)用靜態(tài)方法一樣, 直接用類名調(diào)用, 不需要實(shí)例化(實(shí)際上, 因?yàn)闆]有構(gòu)造函數(shù), 也沒法實(shí)例化)。
6 其他
- 1 Kotlin的語句后面不用
;
- 2 Kotlin中的雙引號和單引號作用是不一樣的, 字符串用雙引號