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的前面三個字母,代表方法。。