1. 程式人生 > >Kotlin第一式:開始體驗0-19

Kotlin第一式:開始體驗0-19

0、這些系統的學習Kotlin,不過不想按部就班,而是想到哪學到哪,看不懂哪裡就學在哪裡

1、我司產品,新需求,均採用Kotlin開發,原諒我總想打成Kotalin,大家也要注意了

Kotlin、Kotlin、Kotlin,寫上三遍,還能忘掉?

2、Kotlin檔案最頂端的package關鍵字,是倒入包,與java的區別在於,已經不再寫分號了,牛13

package com.cmcm.user.login.view.activity

等同於java中的

package com.cmcm.user.login.view.activity;

3、倒入類同樣也把分號幹掉了,牛13

import android.annotation.SuppressLint
import android.app.Activity
import android.content.Intent
import android.graphics.Bitmap
import android.os.Bundle

4、類的一個定義,與java相比省略了public,現在我們引入Kotlin中類的一個語法規則

class SlidingBlockVerifyActivity : BaseActivity(), View.OnClickListener, View.OnTouchListener, SlidingBlockVerifyPresenter.Companion.Callback {

}

final類:不能被繼承

Kotlin中沒有新增修飾符直接以class開頭的都是final類,並且是public

也就是說SlidingBlockVerifyActivity是個final類,也是public

5、讓我們繼續類的一點知識

class SlidingBlockVerifyActivity : BaseActivity(), View.OnClickListener, View.OnTouchListener, SlidingBlockVerifyPresenter.Companion.Callback {

}

等同於java中的

public final class SlidingBlockVerifyActivity extends  BaseActivity implements View.OnClickListener, View.OnTouchListener, SlidingBlockVerityPresenter.Companion.Callback{

}


因為java中沒有Companion這個關鍵字,所以,java中,假設為靜態內部類哈

關鍵字仍然是class

:後面跟的是父類

逗號隔開父類,其父類的後面都是實現的介面

父類:BaseActivity()

介面:View.OnClickListener, View.OnTouchListener, SlidingBlockVerifyPresenter.Companion.Callback

總結一下

SlidingBlockVerifyActivity繼承了一個父類,實現了三個介面

6、這是關於Kotlin中變數的知識:var與val

var mSlidingPercent: Int = 0
    var mCheckPicId: String = "0"
    var mDownX: Int = 0
    var mMobile: String? = "0"
    var mBgFinish = false
    var mBlockFinish = false
    var mVerifySuccess = false

在Kotlin中,變數使用var修飾,只要是變數一定是var修飾

var、var、var,  要寫三遍

語法規則:var 變數名: 變數型別 = 初始值

例如:

var mCheckPicId: String = "0" 

等同於java中的

String mCheckPicId = 0;

感覺變數型別在初始化的時候可以省略哈,感覺,慢慢再去看

在看val的語法規則

在Kotlin中,val修飾的變數,就是常量

val mCheckFlag:String ="hello world"

等同與java中的

final String mCheckFlag = "hello world";

………………………………………………………………………………華麗麗分割線……………………………………………………………………

val mDefaultWidth = 277
val mDefaultHeight = 492

等同於

final int mDefaultWidth = 277;
final int mDefaultHeight = 492;

7、訪問許可權先放一放,另外在Kotlin中的類是可以直接繼承Java中的類,牛13,就是這麼形成

8、Kotlin中的companion,看這B形,就知道這是個關鍵字了,而且目前我所知,java中肯定沒有這個關鍵字

a、

companion object {
        val REQUEST_DEFAULT: Int = 1001
        val PARAMS_MOBILE: String = "params_mobile"

        fun launchActivityForResult(context: Activity, moblie: String, requestCode: Int) {
            val intent = Intent(context, SlidingBlockVerifyActivity::class.java)
            intent.putExtra(PARAMS_MOBILE, moblie)
            context.startActivityForResult(intent, requestCode)
        }
    }

9、第九條,決定放個Tips:

如果不知道如何在Kotlin中寫一個相當簡單的Java表示式。這裡有一個簡單的訣竅,就是在AndroidStudio的Java檔案中編寫一段程式碼,然後將其貼上到kt檔案中,它會自動轉換為Kotlin。

10、Kotlin的優勢

a、易表現:可以編寫少得多的程式碼

b、更安全:Kotlin對null是安全的,就是說在編譯期間就處理了各種null的情況,避免了執行時的異常。節約很多除錯NullPointerException的時間

c、易擴充套件:就算我們沒有許可權去訪問這個類中的程式碼,我們可以擴充套件這個類,以獲得更多的特性

d、函式式:雖然Kotlin是基於面向物件的語言,但它使用了很多函數語言程式設計但概念,例如使用lambda表示式(懵逼中),其中很棒但特性就是Collections但處理方式

e、相容性:可以繼續使用所有java寫但程式碼和庫,一個專案中,可以使用Kotlin和Java兩種語言混合程式設計(公司產品)

11、看個Kotlin中的實體類,即Bean,有多牛逼

a、Kotlin中的資料類,即data修飾的,會自動生成所有屬性和它們的public API,並自動生成對應的equals,hashCode、toString方法,這麼牛比?

data class User(
     var id: Long,
     var name: String,
     var headUrl: String,)

相當於java中的

public class User{
      private long id;
      private String name;
      private String headUrl;

      public void setId(long id){
             this.id = id;
      }

      public long getId(){
             return id;
      }

      public void setName(String name){
              this.name = name;
      }

      public String getName(){
              return name;
      }

      public void setHeadUrl(String headUrl){
              this.headUrl = headUrl;
      }

      public String getHeadUrl(){
              return headUrl;
      }

      @Override 
    public String toString() {
        return "User{" +
          "id=" + id +
          ", name='" + name + '\'' +
          ", headUrl='" + headUrl + '\''
         '}';
    }

}

12、null安全

背景:為了規避NullPoniterException,我們只有不停的判斷 != null

a、但是在Kotlin中,是null安全的

b、安全呼叫操作符   ? 對沒錯就是一個問號

c、如果mRtcEngine為null,就返回null,如果不是才呼叫leaveChannel方法,絕對不會丟擲NullPointerException

mRtcEngine?.leaveChannel()

13、可空型別與非可空型別,通過問號來明確指定一個物件是否可以為null

var a: String = "abc" //非可空型別,不得向 a = null
private var mRtcEngine: RtcEngine? = null  //可空型別 可以 mRtcEngine = null 

14、lateinit關鍵字

我去,這個關鍵字是啥意思啊,頭回見

正式名字:延遲載入,延遲初始化

作用: 在某個一定能執行的程式碼塊中進行初始化,否則編譯會有不通過的提示,切記哦,必須得初始化

private lateinit var mLeftFragment: Fragment

15、!! 操作符

我去!!,這又是什麼?

val l = b!!.length

作用:如果b為null,就會丟擲NullPointerException

16、override,不必問

等同於java中的@override

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

17、const關鍵字

幹哈的?

a、有了val,怎麼又提供了一個const

b、const只能修飾val,不能修飾var

c、經過const修飾的屬性只能同樣用拼接const修飾的屬性去拼接

d、經過const修飾的常量,才是java中理解的常量

companion object {
        const val IS_SHOW_BLOCK_FRIENDS_DIALOG = "is_show_block_friends_dialog"//是否是第一次註冊時
    }

18、$,美元符號的用法

作用1:拼接字串

const val testName = "ZhangSan"

const val constNameNormal: String = "constNameNormal$testName"

19、fun關鍵字,funcation的前面三個字母,代表方法。。