Kotlin 學(xué)習(xí)(kotlin 的基礎(chǔ)語(yǔ)法)

前言

之前的時(shí)候再項(xiàng)目中使用過(guò)Kotlin 了,但是總感覺(jué)自己對(duì)于Kotlin 的認(rèn)識(shí)有點(diǎn)淺薄浅侨。所以仗颈,專(zhuān)門(mén)重新學(xué)習(xí)了一下。

開(kāi)發(fā)準(zhǔn)備 :

  • 開(kāi)發(fā)工具 : IntelliJ IDEA

  • 開(kāi)發(fā)語(yǔ)言 : kotlin

  • 開(kāi)發(fā)調(diào)整: 1. IntelliJ 默認(rèn)字體很小订歪,所以調(diào)大一些 2.設(shè)置IntelliJ 不區(qū)別大小寫(xiě)

  • 創(chuàng)建項(xiàng)目
    選擇項(xiàng)目的時(shí)候勾選kotlin


    image.png

創(chuàng)建kotlin 主函數(shù)的時(shí)候刷晋,千萬(wàn)不要將自己創(chuàng)建的.kt 文件創(chuàng)建稱(chēng)為有一個(gè)類(lèi)眼虱,而是創(chuàng)建成為一個(gè)文件捏悬。然后润梯,在文件中直接使用主函數(shù)。


image.png

開(kāi)始學(xué)習(xí)

main方法(主函數(shù))

我們知道刀疙,在java 中任何方法都是從主函數(shù)開(kāi)始運(yùn)行的谦秧。主函數(shù)的寫(xiě)作方法如下:

public class Demos {
    public static void main(String[] args) {

    }
}

那么我嗎知道油够,在kotlin 中使用主函數(shù)的話(huà)石咬,是這個(gè)樣子的:

fun main(arras: Array<String>){
}

大家可以看見(jiàn)左側(cè)的Demo.kt 是灰色的鬼悠,那么很多的人就會(huì)感覺(jué)到特別的難受焕窝,所以维贺,我們可以這個(gè)樣子進(jìn)行使用

class Demoss {
    companion object{
        @JvmStatic
        fun main(args:Array<String>){
             }
    }
}

當(dāng)然溯泣,經(jīng)過(guò)我的測(cè)試垃沦,這個(gè)里面有三個(gè)注意點(diǎn):

    1. 將文件內(nèi)添加 companion objec{} 肢簿,這個(gè)代碼塊,相當(dāng)于java 中的static關(guān)鍵字
  • 2.添加@JvmStatic 注解
  • 3.main函數(shù)必須是該模板的桩引,當(dāng)然參數(shù)名稱(chēng)可以修改坑匠,可以添加返回值

kotlin 文件也變?yōu)榱艘粋€(gè)類(lèi)的形式進(jìn)行展示笛辟,而不是.kt 的文件進(jìn)行使用


image.png

方法(函數(shù))

在kotlin 中方法的構(gòu)建格式如下
fun 方法名(參數(shù)名:參數(shù)類(lèi)型):返回值類(lèi)型 { 代碼塊的內(nèi)容 }

我們知道方法的構(gòu)建功氨,那么我們就坐幾個(gè)小例子:

  • 要求 : 定義一個(gè)方法,計(jì)算機(jī)兩個(gè)數(shù)的和
    那么我們這邊根據(jù)模板套入得出如下的結(jié)果:
  fun sum(a: Int, b: Int) :Int{
        return a + b
    }

在其他的地方如果有人見(jiàn)到這個(gè)格式也需要知道和上方的結(jié)果一致:

  fun sumTow(a: Int, b: Int) = a + b

這里手幢,我們先不說(shuō)結(jié)論捷凄,繼續(xù)下一個(gè)知識(shí)點(diǎn)。
大家可以看見(jiàn)main 函數(shù)和之前的方法構(gòu)造不相同围来。那么就有人疑惑了跺涤,難道主函數(shù)和其他的函數(shù)不同嗎?
原來(lái)桶错,不是主函數(shù)和之前的函數(shù)不同,而是省略了返回值胀蛮,我們這里院刁,將返回值補(bǔ)上看一下。


主函數(shù)

原來(lái)粪狼,主函數(shù)是省略了返回值(Unit 和java 中的 void 一樣退腥,為無(wú)返回值類(lèi)型)
我們?cè)倏瓷厦妫敲次覀円矊⒎祷刂导由显匍贸鋈缦碌慕Y(jié)果

  fun sumTow(a: Int, b: Int):Int = a + b

這里狡刘,我們得出結(jié)論:
方法的變形格式為:
fun 方法名稱(chēng)(參數(shù)名稱(chēng):參數(shù)類(lèi)型):返回值類(lèi)型 = 返回值結(jié)果
我們可以看見(jiàn) 如果使用等于號(hào)的時(shí)候,可以省略返回值類(lèi)型困鸥,等于號(hào)就相當(dāng)于代碼塊以及之內(nèi)的return關(guān)鍵字

變量和常量

變量: 指的是可以變化的量
常量: 指的是不可變的量

在java 中變量是如何定義的嗅蔬?
變量類(lèi)型 變量名 = 變量值;

如疾就,這個(gè)int 類(lèi)型的變量num 澜术,值為20 :

 int num = 20;

那么,在kotlin 中如何使用的呢虐译?

    var num = 20

這里瘪板,我們先說(shuō)一下吴趴。var 是關(guān)鍵字漆诽,代表的是申明一個(gè)變量。如果想要使用的話(huà)那么直接使用 var 參數(shù)名= 參數(shù)值就可以了锣枝。
有人問(wèn)了厢拭,var 是代表申明一個(gè)變量。但是這個(gè)變量什么類(lèi)型都可以聲明撇叁,那么如果想要申明一個(gè)int 類(lèi)型的變量呢供鸠?
我們可以這個(gè)樣子進(jìn)行申明:

  var num : Int = 20

如果給這個(gè)變量賦值其他類(lèi)型的值,那么就會(huì)出現(xiàn)如下的錯(cuò)誤


變量規(guī)定類(lèi)型后使用錯(cuò)誤的類(lèi)型進(jìn)行使用

這個(gè)就是變量的使用陨闹,那么我們繼續(xù)來(lái)說(shuō)常量楞捂。
在java 中薄坏,如何定義常量?給想要的值添加final 關(guān)鍵字寨闹,final 關(guān)鍵字胶坠,代表的是 public static final ,所以是這個(gè)樣子進(jìn)行定義的:

    public  static  final  String result = "常量";

那么繁堡,在kotlin 中是如何定義的沈善?

    val result = "常量"

如果對(duì)于這個(gè)值進(jìn)行使用,那么會(huì)有如下的提示:


告訴我們椭蹄,常量類(lèi)型不可以修改闻牡,如果想要使用的話(huà)將類(lèi)型轉(zhuǎn)變?yōu)樽兞?/div>

注釋

kotlin 中的注釋和Java 中的注釋一樣,分為三種: 單行注釋?zhuān)嘈凶⑨尯臀臋n注釋

    // 單行注釋
    /*
    多行注釋
     */
    /** 
     * 文檔注釋
     */

字符串模板

kotlin 中有一個(gè)字符串模板绳矩。

我自己認(rèn)為字符串模板有兩種樣式:
樣式1:“內(nèi)容(引入的內(nèi)容)內(nèi)容” 樣式2 : “內(nèi)容{引入內(nèi)容}內(nèi)容”
這里介紹一下:
樣式1的內(nèi)容代表的是要輸入的內(nèi)容代表的是要引入內(nèi)容()中代表的是要引入數(shù)據(jù)罩润,當(dāng)然這個(gè)()是我加出來(lái)給大家看的,在代碼中不需要添加 樣式2的內(nèi)容代表的是要輸入的內(nèi)容{}代表需要引入代碼塊翼馆,在代碼塊中設(shè)置數(shù)據(jù)

這里給大家看一些例子:

    var num : Int = 20
    fun print(){
        //輸出數(shù)據(jù)
        var prints = "請(qǐng)輸出要數(shù)據(jù)$num"
        var printss = "請(qǐng)計(jì)算結(jié)果${num+num}"
    }

條件表達(dá)式

在kotlin 中哨啃,如果是簡(jiǎn)單的語(yǔ)句,那么可以不添加代碼塊(也就是{})写妥。當(dāng)然拳球,這個(gè)樣子在java中不可以。比如珍特,下面的這個(gè)例子:
java:

 int result(int a, int b) {
        if (a > b) {
            return a + b;
        } else {
            return a - b;
        }
    }

kotlin :

    fun result(a: Int, b: Int) = if (a > b) a + b else a - b

這里介紹一下祝峻,kotlin中只有 if (a > b) a + b else a - b 這個(gè)是條件表達(dá)式的樣例,方法的例子只是回顧一下子扎筒,大家千萬(wàn)別將知識(shí)點(diǎn)混淆莱找。

可空值和空檢查

kotlin 中的可空值和空檢查是什么呢?我們這里需要進(jìn)行講解嗜桌。
可空值:代表的是在kotlin中值不再像java 中一樣奥溺,比如:原先有一個(gè)字符串str ,之前的時(shí)候值是“內(nèi)容”骨宠,如果不想進(jìn)行使用浮定,那么就可以將這個(gè)值設(shè)置為“null”。但是层亿,在kotlin中桦卒,對(duì)于類(lèi)型的檢查更加的嚴(yán)格,如果你定義一個(gè)字符串類(lèi)型的值匿又,如果沒(méi)有對(duì)于他添加可空值的標(biāo)識(shí)方灾,那么你在代碼中將這個(gè)值設(shè)置為"null",那么代碼就會(huì)報(bào)錯(cuò)。
比如:


提示顯示的是null類(lèi)型的值碌更,不可以轉(zhuǎn)為非null的類(lèi)型

但是裕偿,如果我們想要在代碼中進(jìn)行設(shè)置洞慎,那么我們就可以使用?(可空值判斷符)進(jìn)行定義嘿棘。


image.png

空檢查:代表的是kotlin為了解決java 中特別常見(jiàn)的空指針異常拢蛋,對(duì)于null(也就是空值)的一系列空安全檢查機(jī)制。

類(lèi)型檢查和自動(dòng)轉(zhuǎn)換

首先和大家介紹一個(gè)類(lèi)型Any蔫巩。Any 大家可能會(huì)想到Anything 谆棱。所以,Any 和java 中的Object 類(lèi)一樣圆仔,都是代表所有類(lèi)的基類(lèi)垃瞧。當(dāng)時(shí)Any 絕對(duì)不是java 中的Object 。
上面的Any類(lèi)型大家知道了坪郭,那么就開(kāi)始正式的類(lèi)型轉(zhuǎn)換个从。


is 是類(lèi)型檢查,表示檢查當(dāng)前的類(lèi)型是什么

大家可以看到歪沃,我在代碼中使用的是一個(gè)is 關(guān)鍵字嗦锐,代表的就是判斷當(dāng)前的類(lèi)型。如沪曙,any 為字符串類(lèi)型的奕污。所以就可以直接進(jìn)行自動(dòng)的轉(zhuǎn)換,使用字符串類(lèi)型的方法液走。但是碳默,如果沒(méi)有判斷類(lèi)型,那么就算是相同的代碼都不可以執(zhí)行缘眶。

for 循環(huán)

我記得在學(xué)習(xí)java 的時(shí)候嘱根,我們就是第一天搭建環(huán)境,之后就學(xué)習(xí)循環(huán)巷懈,判斷語(yǔ)法等该抒。所以,我們這里先回顧一下java 中的for循環(huán)顶燕。

    // 普通 for 循環(huán)
        for (int i = 0 ; i < 30;i++){
            System.out.println("普通循環(huán)的內(nèi)容");
        }
        // 死循環(huán)
        for (;;){
            System.out.println("死循環(huán)的內(nèi)容");
        }

這里凑保,我們看一下kotlin 的for 循環(huán)

       // 普通for 循環(huán),這里的in ... until ... 代表的是從 開(kāi)始的值割岛,到結(jié)束的值愉适。會(huì)輸出 0-30,但是包含0癣漆,不包含30的結(jié)果。
            for (i in 0 until 30){
                print("普通for循環(huán)$i")
            }

    val items = listOf("apple", "banana", "kiwifruit")
            // 顯示方式1: i 表示的是內(nèi)容
            for (i in items){
                println(i)
            }
            // 顯示方式2 : i 表示的是對(duì)象的下標(biāo)值
            for (i in items.indices){
                println(i)
            }

當(dāng)然剂买,kotlin中for 循環(huán)不再死循環(huán)惠爽。

while 循環(huán) 和 do while 循環(huán)

在java 中癌蓖,有著 while 循環(huán)和 do ... while 循環(huán),在kotlin 中同樣擁有婚肆。
java :

   // while 語(yǔ)句和 do ... while 語(yǔ)句的區(qū)別.while 語(yǔ)句
        // 租副,如果不滿(mǎn)足就不會(huì)進(jìn)入循環(huán),但是do... while 語(yǔ)句會(huì)先執(zhí)行一次较性,然后再進(jìn)入
        //所以wehile 語(yǔ)句用僧,最少不會(huì)執(zhí)行,但是do... while與語(yǔ)句赞咙,最少會(huì)執(zhí)行一次责循。
        // 總結(jié): while 語(yǔ)句,先判斷在執(zhí)行攀操,do院仿。。速和。while 語(yǔ)句先執(zhí)行再判斷
        // while 循環(huán),必須要設(shè)置一個(gè)知道不滿(mǎn)足的時(shí)刻歹垫,否則會(huì)出現(xiàn)死循環(huán)
       int results = 20;
        while (results < 100){
            System.out.println("輸出語(yǔ)句" + results);
            results++;
        }
        int resultss = 20;
        // do ... while 語(yǔ)句
        do {
            System.out.println("輸出語(yǔ)句" +resultss );
            resultss++;
        }while (resultss < 100);

kotlin :

  var start = 20
            while (start < 200){
                start++
            }
            var starts = 200
            do {
                starts-- 
            }while (starts<20)

kotlin 中的while 和do.. while特別的類(lèi)似,這里就不再進(jìn)行介紹了颠放。

when 表達(dá)式

when 表達(dá)式和java 中的switch 語(yǔ)句特別的相似排惨,這里我們看一下。
java:

     String strs = "h";
        // case :表示判斷類(lèi)型的值
        // break : 表示跳出判斷碰凶,如果不添加若贮,那么就會(huì)繼續(xù)執(zhí)行
        // default : 標(biāo)配是上述的都不滿(mǎn)足的情況
        switch (strs){
            case "h":
                break;
            case  "0":
                break;
            case  "a":
                break;
            default:            
        }

kotlin 的when語(yǔ)句:

    var strss = 1
            when (strss) {
                1 -> 1
                2 -> 2
                3 -> { 3}
                4 -> { 4}
                else -> { 0}
            }

這里 ->表示的是要顯示的結(jié)果。

范圍

剛才在上面的時(shí)候我們看過(guò)for循環(huán)中有 for(i in 0 until 30)這個(gè)操作痒留,那么我們?cè)倏匆幌虑绰螅渌姆绞?/p>

   val ints = 0..20
            for ( i in ints){
                println(" 當(dāng)前的數(shù)是 $i")
            }

這里解釋一下。 0 .. 20 ,代表的是一個(gè)范圍 伸头。和until不同的是匾效,0..20 代表從0-20包含20。而0 until 20 代表的是從0-20不包含20恤磷。

集合的使用

這里既然說(shuō)到集合的使用面哼,那么先說(shuō)一下kotlin 中的集合。
kotlin 中集合的創(chuàng)建:

   // Arraylist 的創(chuàng)建扫步,和java 中 ArrayList 一樣魔策,只不過(guò)去除了關(guān)鍵字 new
            val lists = ArrayList<String>()
            // 添加數(shù)據(jù)
            lists.add("apple")
            lists.add("banana")
            // kotlin 特有的,有點(diǎn)像java 中數(shù)組的添加方式
            val listss = arrayListOf<String>("蘋(píng)果","香蕉")

kotlin 中集合的遍歷:

    // Arraylist 的創(chuàng)建河胎,和java 中 ArrayList 一樣闯袒,只不過(guò)去除了關(guān)鍵字 new
            val lists = ArrayList<String>()
            // 添加數(shù)據(jù)
            lists.add("apple")
            lists.add("banana")
            lists.add("abcedgf")
            // kotlin 特有的,有點(diǎn)像java 中數(shù)組的添加方式
            val listss = arrayListOf<String>("蘋(píng)果", "香蕉")
            // for 循環(huán)遍歷
            for (i in lists) {
                println(i)
            }
            // when 循環(huán)
            when {
                "apple" in lists -> {
                }
                "banana" in lists -> {
                }
            }
            // 使用 fifter 的時(shí)候
            lists.
                // 進(jìn)行篩選
                filter {
                    // 判斷內(nèi)容是否是以a字母開(kāi)頭
                    it.startsWith("a")
                }
                    // 按照字母順序排列原有的字符串
                .sortedBy { it }
                .map {
                    // 將內(nèi)容轉(zhuǎn)化為大寫(xiě)
                    it.toUpperCase()
                }
                // 打印
                .forEach { println(it) }

這里介紹的是三種方式: 我經(jīng)常使用的是第一種,第三種政敢,第二種就其徙。。喷户。唾那。。褪尝。算了吧闹获!

創(chuàng)建類(lèi)以及實(shí)例

大家知道,在java 中創(chuàng)建類(lèi)那么就需要使用new 關(guān)鍵字來(lái)進(jìn)行實(shí)例河哑,那么我們就來(lái)對(duì)比一下java 和 kotlin 創(chuàng)建類(lèi)的使用場(chǎng)景避诽。
java :創(chuàng)建StringBuffer 的實(shí)例

      StringBuffer stringBuffer = new StringBuffer();

kotlin : 創(chuàng)建StringBuffer的實(shí)例

var sb :StringBuffer = StringBuffer()

總結(jié):這里我們創(chuàng)建實(shí)例,不需要在添加new 關(guān)鍵字灾馒。

結(jié)尾的話(huà):

這里我們先介紹一下kotlin 的基礎(chǔ)語(yǔ)法茎用。當(dāng)然了,這里的內(nèi)容來(lái)自 kotlin官網(wǎng) 睬罗,我只是把那里的內(nèi)容翻譯了一下轨功,然后加了一些自己的想法。如果大家認(rèn)為哪兒有問(wèn)題容达,請(qǐng)給我留言古涧,我一定會(huì)及時(shí)改正的。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末花盐,一起剝皮案震驚了整個(gè)濱河市羡滑,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌算芯,老刑警劉巖禽捆,帶你破解...
    沈念sama閱讀 221,888評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件柜某,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)愁憔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)团滥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)脏嚷,“玉大人赁炎,你說(shuō)我怎么就攤上這事∫庀担” “怎么了泥耀?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,386評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)蛔添。 經(jīng)常有香客問(wèn)我痰催,道長(zhǎng)兜辞,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,726評(píng)論 1 297
  • 正文 為了忘掉前任陨囊,我火速辦了婚禮弦疮,結(jié)果婚禮上夹攒,老公的妹妹穿的比我還像新娘蜘醋。我一直安慰自己,他們只是感情好咏尝,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,729評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布压语。 她就那樣靜靜地躺著,像睡著了一般编检。 火紅的嫁衣襯著肌膚如雪胎食。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,337評(píng)論 1 310
  • 那天允懂,我揣著相機(jī)與錄音厕怜,去河邊找鬼。 笑死蕾总,一個(gè)胖子當(dāng)著我的面吹牛粥航,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播生百,決...
    沈念sama閱讀 40,902評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼递雀,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了蚀浆?” 一聲冷哼從身側(cè)響起缀程,我...
    開(kāi)封第一講書(shū)人閱讀 39,807評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎市俊,沒(méi)想到半個(gè)月后杨凑,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,349評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡摆昧,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,439評(píng)論 3 340
  • 正文 我和宋清朗相戀三年撩满,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片据忘。...
    茶點(diǎn)故事閱讀 40,567評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鹦牛,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出勇吊,到底是詐尸還是另有隱情曼追,我是刑警寧澤,帶...
    沈念sama閱讀 36,242評(píng)論 5 350
  • 正文 年R本政府宣布汉规,位于F島的核電站礼殊,受9級(jí)特大地震影響驹吮,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜晶伦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,933評(píng)論 3 334
  • 文/蒙蒙 一碟狞、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧婚陪,春花似錦族沃、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,420評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至沽一,卻和暖如春盖溺,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背铣缠。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,531評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工烘嘱, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蝗蛙。 一個(gè)月前我還...
    沈念sama閱讀 48,995評(píng)論 3 377
  • 正文 我出身青樓蝇庭,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親歼郭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子遗契,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,585評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容