第一章 kotlin基礎入門

1.Kotlin簡介以及創(chuàng)建kotlin工程

在 Google I/O 2019 上,Google 宣布 Kotlin 成為 Android 的第一開發(fā)語言。這對于開發(fā)者來講意味著,將來所有的官方示例會首選 Kotlin,并且 Google 對 Kotlin 在開發(fā)点楼、構建等各個方面的支持也會更優(yōu)先。

在這個大環(huán)境下白对,Kotlin是必須的趨勢掠廓,因此,學會并掌握 Kotlin 成了 Android 開發(fā)者的當務之急甩恼。

  android studio 集成了kotlin蟀瞧,創(chuàng)建一個新的kotlin工程沉颂,只需要在在創(chuàng)建project的時候選定語言為kotlin即可。

2.kotlin中的變量黄橘、函數(shù)和類別

  為方便理解兆览,之后的內(nèi)容將結合建議的代碼進行解釋。

```

package org.kotlinmaster

import android.os.Bundle

import androidx.appcompat.app.AppCompatActivity

class MainActivity : AppCompatActivity() {

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

? ? ? ? super.onCreate(savedInstanceState)

? ? ? ? setContentView(R.layout.activity_main)

? ? }

}

```

  以上的內(nèi)容塞关,便是以kotlin為開發(fā)語言抬探,創(chuàng)建了一個Empty Activity之后,MainActivity中的代碼帆赢。?

  從上可以看出小压,導入、包椰于、以及類的關鍵字和java一樣怠益,當然也有一些不同,為了理解簡單瘾婿,我們可以再度簡化一下蜻牢。?

  在AS上新建一個kotlin文件,不繼承任何類偏陪,命名為Example抢呆,代碼如下:

```

package com.example.mediaplayer

class Example {

}

```

2.1變量

2.1.1 變量的聲明:?

我們聲明一個View類型的變量,使用java語言:?

```

View v;

```

使用kotlin語言:

```

var v : View

```

對比可以發(fā)現(xiàn)笛谦,在kotlin里的變量聲明抱虐,需要使用var關鍵字,變量名在類名的前面饥脑,而且兩者中間有冒號隔開恳邀。(不管是局部變量,成員變量灶轰,甚至是方法中的參數(shù)谣沸,都是使用? ? ==變量名 :變量類型==? 的方式來書寫)?

ps:kotlin中語句結尾不需要加分號。

### 2.1.2 空安全機制

以上是kotlin中一般變量的聲明笋颤,但是這么寫IDE會爆出錯誤:?

Property must be initialized or be abstract(屬性必須初始化或者為抽象的)

```

var v : View

? ? //Property must be initialized or be abstract

```

關于抽象部分鳄抒,后面再說,此處先講解必須初始化椰弊,這里引出kotlin語言的一個比較實用的地方————空安全機制许溅。?

在Java中,變量都有默認值秉版,基本類型贤重、引用類型都是如此。但在kotlin中清焕,變量是沒有默認值的并蝗,要求變量在聲明的時候必須初始化祭犯。

```

class Sample {

? ? var v: View = null

? ? // 這樣寫 IDE 仍然會報錯,Null can not be a value of a non-null type View

}

```

non-null type滚停,非空類型沃粗,在kotlin中聲明的所有變量,默認皆為非空類型键畴,不能賦予空值最盅。對于不能確認非空與否的變量(例如model中的變量),則添加起惕?表明其可空涡贱,所以:

```

class Sample {

? ? var v: View? = null

}

```

上述變量v惹想,你可以在代碼中的任意地方將null值賦予它问词。?

當聲明可空變量后,使用它又會產(chǎn)生新的問題:

```

var view: View? = null

view.setBackgroundColor(Color.RED)

// 這樣寫會報錯嘀粱,Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type View?

```

這就是見得非常多的NullPointerException,用常規(guī)做法判斷一下:

```

if (view != null) {

? ? view.setBackgroundColor(Color.RED)

? ? // 這樣寫會報錯激挪,Smart cast to 'View' is impossible, because 'view' is a mutable property that could have been changed by this time

}

```

IDE不接受這樣的做法,因為即使判斷非空锋叨,也可能在調(diào)用之前被重新置為空(多線程操作)灌灾。?

遇到這樣的問題,其實IDE已經(jīng)提示過了兩種解決辦法悲柱,一種是安全調(diào)用(safe call),使用方式為?.:

```

var view: View? = null

view?.setBackgroundColor(Color.RED)

```

這種方法會在調(diào)用方法之前再做一次非空判斷些己,并且保證線程安全豌鸡,所以叫做安全調(diào)用(safe call).

另一種方法則有些風險,叫做「non-null asserted call」段标,非空斷言調(diào)用涯冠,使用方式為!!.:

```

...

view!!.setBackgroundColor(Color.RED)

```

這表示你保證view為非空類型,并且自己承擔后果逼庞,不需要編譯器檢查蛇更。當編譯器運行到此的時候,便會跳過非空檢查這一步赛糟,直接調(diào)用方法派任。?

以上,便是kotlin的空安全機制璧南,歸納起來有幾點:?

1.變量必須手動初始化掌逛,否則會報錯。?

2.變量默認為非空類型司倚,非空類型在任何地方均不能賦予空值豆混。?

3.可空類型在使用時篓像,會因為“可能為空”報錯,需要注意皿伺。

其實在java中也有類似的安全機制設計员辩,那就是名為@NotNull 和 @Nullable 注解,會將變量轉(zhuǎn)換為可空和非空類型鸵鸥。

2.1.3延遲初始化

回到主界面的代碼中:

```

package com.example.mediaplayer

import androidx.appcompat.app.AppCompatActivity

import android.os.Bundle

import android.widget.Button

open class MainActivity : AppCompatActivity() {

? ? private var mBtn: Button

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

? ? ? ? super.onCreate(savedInstanceState)

? ? ? ? setContentView(R.layout.activity_main)

? ? ? ? mBtn = findViewById(R.id.btn_click)

? ? }

}

```

在了解空安全機制過后奠滑,便知道如上代碼絕對會報錯,mBtn為非空類型脂男,必須初始化养叛。但是我們一般的習慣,是先聲明宰翅,在鋪設布局之后弃甥,從布局中獲取相應控件,賦值給變量汁讼。在不使用可空聲明的情況下淆攻,我們可以使用延遲初始化的方式,來使之符合我們的編寫習慣嘿架。這里要用到一個新的關鍵字————lateinit,望詞知義瓶珊,就是延遲初始化的意思。

```

...

open class MainActivity : AppCompatActivity() {

? ? private lateinit var mBtn: Button

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

? ? ? ? super.onCreate(savedInstanceState)

? ? ? ? setContentView(R.layout.activity_main)

? ? ? ? mBtn = findViewById(R.id.btn_click)

? ? }

}

```

使用lateinit關鍵字之后耸彪,編譯器便不會檢查變量的初始化和非空聲明伞芹,只要注意如java一樣在使用前初始化變量就行。

2.1.4類型推斷

在kotlin中有一個方便之處蝉娜,那便是在類型聲明的時候唱较,若是直接聲明初始值,則不用寫出變量類型召川。

```

var name: String = "Mike"

```

```

var name = "Mike"

```

以上的兩種方式都可以南缓。

2.1.5 val 與 var

val 是 Kotlin 在 Java 的「變量」類型之外,又增加的一種變量類型:只讀變量荧呐。它只能賦值一次汉形,不能修改。而 var 是一種可讀可寫變量倍阐。

var 是 variable 的縮寫概疆,val 是 value 的縮寫。

val 和 Java 中的 final 類似:

```

final int size = 18;

```

```

val size = 18

```

final與val是不完全等同的峰搪,但有個共同點届案,直接進行重新賦值是不行的。

2.1.6 可見性

可見性見3.3罢艾。

2.2 函數(shù)

在Java中的方法(method)楣颠,在kotlin中稱之為函數(shù)(function)尽纽。

2.2.1 函數(shù)的聲明

我們先來看看 Java 里的方法是怎么寫的:

```

Food cook(String name) {

? ? ...

}

```

而到了 Kotlin,函數(shù)的聲明是這樣:

```

fun cook(name: String): Food {

? ? ...

}

```

以 fun 關鍵字開頭童漩,返回值寫在了函數(shù)和參數(shù)后面弄贿。?

和在java中不一樣,java中沒有返回值的時候矫膨,也必須以void表示差凹,并寫出來,而kotlin中返回值沒有的話侧馅,可以不寫危尿,也可以寫成Unit。

```

void cook(String name) {

? ? ...

}

```

```

fun cook(name: String): Unit {

? ? ...

}

或者

fun cook(name: String){

? ? ...

}

```

函數(shù)的參數(shù)也可以是可空類型的馁痴,結合上面講到的空安全機制谊娇,使用時要注意:

```

// 可空變量傳給不可空參數(shù),報錯

var myName : String? = "jidou"

fun cook(name: String) : Food {}

cook(myName)


//可空變量傳給可空參數(shù)罗晕,正常運行

var myName : String? = "jidou"

fun cook(name: String?) : Food {}

cook(myName)

// 不可空變量傳給不可空參數(shù)济欢,正常運行

var myName : String = "jidou"

fun cook(name: String) : Food {}

cook(myName)

```

**可見性:**?

函數(shù)的默認可見性是public(以override修飾的方法除外其可見性繼承自父類),一般不寫出來小渊,除此之外的可見性修飾要寫出來法褥。

2.2.2 屬性的 getter/setter 函數(shù)

在 Java 里面的 field 經(jīng)常會帶有 getter/setter 函數(shù):

```

public class User {

? ? String name;

? ? public String getName() {

? ? ? ? return this.name;

? ? }

? ? public void setName(String name) {

? ? ? ? this.name = name;

? ? }

}

```

這兩個函數(shù)的作用就是除了保護數(shù)據(jù)的可見性之外,還可以自定義函數(shù)內(nèi)部來達到對數(shù)據(jù)做一定處理的效果酬屉,比如下面這種:

```

public class User {

? ? String name;

? ? public String getName() {

? ? ? ? return this.name + " hello";

? ? }

? ? public void setName(String name) {

? ? ? ? this.name = "wow " + name;

? ? }

}

```

在 Kotlin 里半等,這種 getter / setter 是怎么運作的呢?

```

class User {

? ? var name = "Mike"

}

```

```

class User1 {

? ? fun run() {

? ? ? ? var user = User()

? ? ? ? user.name = "JACK"

? ? ? ? // 上面的寫法實際上是這么調(diào)用的

? ? ? ? // user.setName("JACK")

? ? ? ? // 建議自己試試呐萨,IDE 的代碼補全功能會在你打出 setn 的時候直接提示 name 而不是 setName

? ? ? ? println(user.name)

? ? ? ? // 的寫法實際上是這么調(diào)用的

? ? ? ? // print(user.getName())

? ? ? ? // IDE 的代碼補全功能會在你打出 getn 的時候直接提示 name 而不是 getName

? ? }

}

```

那么我們?nèi)绾蝸聿僮髑懊嫣岬降臄?shù)據(jù)處理呢杀饵?看下面這段代碼:

```

class User {

? ? var name = "Mike"

? ? ? ? get() {

? ? ? ? ? ? return field + " nb"

? ? ? ? }

? ? ? ? set(value) {

? ? ? ? ? ? field = "Cute " + value

? ? ? ? }

}

```

格式上和 Java 有一些區(qū)別:

**getter / setter 函數(shù)有了專門的關鍵字 get 和 set?

getter / setter 函數(shù)位于 var 所聲明的變量下面?

setter 函數(shù)參數(shù)是 value**?

注意此為默認情況,若是屬性用private修飾垛吗,則可以寫成java中的一般用法:

```

class User {

? ? private var name = "Mike"

? ? fun getName():String{

? ? ? ? return name;

? ? }

? ? fun setName(bb:String){

? ? ? ? name = bb

? ? }

}

```

```

class User1 {

? ? fun run() {

? ? ? ? var user = User()

? ? ? ? user.setName("JACK")

? ? ? ? print(user.getName())

? ? }

}

```

除此之外還多了一個叫 field 的東西。這個東西叫做「Backing Field」烁登,中文翻譯是幕后字段或后備字段怯屉。具體來說,你的這個代碼:

```

class Kotlin {

? var name = "jidouauto"

}

```

在編譯后的字節(jié)碼大致等價于這樣的 Java 代碼:

```

public final class Kotlin {

? @NotNull

? private String name = "jidouauto";

? @NotNull

? public final String getName() {

? ? ? return this.name;

? }

? public final void setName(@NotNull String name) {

? ? ? this.name = name;

? }

}

```

上面的那個 String name 就是 Kotlin 幫我們自動創(chuàng)建的一個 Java field饵沧。這個 field 對編碼的人不可見锨络,但會自動應用于 getter 和 setter,因此它被命名為「Backing Field」(backing 的意思是在背后進行支持)狼牺。

所以羡儿,雖然 Kotlin 的這個 field 本質(zhì)上確實是一個 Java 中的 field,但對于 Kotlin 的語法來講是钥,它和 Java 里面的 field 完全不是一個概念掠归。在 Kotlin 里缅叠,它相當于每一個 var 內(nèi)部的一個變量。

我們前面講過 val 是只讀變量虏冻,只讀的意思就是說 val 聲明的變量不能進行重新賦值肤粱,也就是說不能調(diào)用 setter 函數(shù),因此厨相,val 聲明的變量是不能重寫 setter 函數(shù)的领曼,但它可以重寫 getter 函數(shù):

```

val name = "Mike"

? ? get() {

? ? ? ? return field + " hello"

? ? }

```

val 所聲明的只讀變量,在取值的時候仍然可能被修改蛮穿,這也是和 Java 里的 final 的不同之處庶骄。

關于這兩個函數(shù)的作用,除了修改取值和賦值践磅,也可以加一些自己的邏輯单刁,就像我們在 Activity 的生命周期函數(shù)里做的事情一樣。

2.3 Kotlin的類型

2.3.1 基本類型

在 Kotlin 中音诈,所有東西都是對象幻碱,Kotlin 中使用的基本類型有:數(shù)字、字符细溅、布爾值褥傍、數(shù)組與字符串。

```

var number: Int = 1 // 還有 Double Float Long Short Byte 都類似

var c: Char = 'c'

var b: Boolean = true

var array: IntArray = intArrayOf(1, 2) // 類似的還有 FloatArray DoubleArray CharArray 等喇聊,intArrayOf 是 Kotlin 的 built-in 函數(shù)

var str: String = "string"

```

PS:和Java不同的是恍风,數(shù)字類型、布爾類型誓篱、字符類型的首字母需要大寫朋贬。

在java中,int 和Integer與kotlin中不同窜骄,主要表現(xiàn)在裝箱方面锦募。

```

int a =1;

Integer b = 1;//自動裝箱

```

在kotlin中只有可空變量聲明會自動裝箱庆捺,一切非空變量都是不裝箱的呆贿。

數(shù)組的寫法也和java的常規(guī)寫法不太一樣。

2.3.2 類和對象

2.3.2.1 類

現(xiàn)在可以來看看我們的老朋友 MainActivity 了鲁驶,重新認識下它:

```

class MainActivity : AppCompatActivity() {

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

? ? ? ? ...

? ? }

}

```

```

public class MainActivity extends AppCompatActivity {

? ? @Override

? ? protected void onCreate(@Nullable Bundle savedInstanceState) {

? ? ? ? ...

? ? }

}

```

對比 Java 的代碼來看有哪些不同:

首先是類的可見性准验,Java 中的 public 在 Kotlin 中可以省略赎线,Kotlin 的類默認是 public 的(包括方法、以及未寫明可見性修飾符的變量等)糊饱。

類的繼承的寫法垂寥,Java 里用的是 extends,而在 Kotlin 里使用 :,但其實 : 不僅可以表示繼承滞项,還可以表示 Java 中的 implement狭归,以及聲明變量時候的類型指定。?

如果實現(xiàn)點擊監(jiān)聽器蓖扑,如上代碼則可以寫成:

```

class MainActivity : AppCompatActivity() ,View.OnClickListener{

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

? ? ? ? ...

? ? }

}

```

```

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

? ? @Override

? ? protected void onCreate(@Nullable Bundle savedInstanceState) {

? ? ? ? ...

? ? }

}

```

kotlin中不需要使用implements關鍵字唉铜。

其次便是方法重載時候的不同,Java中需要在方法前加@Override律杠,在kotlin中潭流,override變成了關鍵字,直接寫在fun的前面柜去,表示方法重載灰嫉。protected修飾符也不見了,在kotlin中嗓奢,可見性直接繼承自父類讼撒。

**類的繼承:**?

kotlin中類以及的默認可見性是public(可以直接省略不寫),按照java的習慣股耽,是可以直接繼承的根盒。?

但是,kotlin中直接繼承可見性為public的類物蝙,會報錯:This type is final, so it cannot be inherited from炎滞。?

在kotlin中,類除了是public的诬乞,還是默認final的册赛,無法被繼承的。那要想繼承一個類震嫉,該怎么辦森瘪?? 答案便是在class之前添加一個open關鍵字,解除final的限制票堵,讓類可以被其他類繼承扼睬。

```

open class MainActivity : AppCompatActivity() {

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

? ? ? ? ...

? ? }

}

```

2.3.2.2 對象

對象作為類的實例,java和kotlin中獲取的方式又有了很大的不同悴势,以我們最開始創(chuàng)建的Example類為例:

```

void test() {

? ? Example examJava = new Example();

}

```

```

fun test() {

? ? var examJava : Example = Example();

}

```

對于類型窗宇,我們要注意:?

類的可見性和開放性?

構造方法?

繼承?

override 函數(shù)

2.3.3 類型判斷以及強轉(zhuǎn)

Java中的多態(tài),在kotlin中也有體現(xiàn)瞳浦。如果父類使用子類的方法担映,需要進行類型判斷废士,使用instanceof關鍵字判斷叫潦,然后轉(zhuǎn)換類型,在調(diào)用方法官硝。

```

class NewActivity : MainActivity() {

? ? fun action() {}

}

```

那么接下來這么寫是無法調(diào)用該函數(shù)的:

```

fun main() {

? ? var activity: Activity = NewActivity()

? ? // activity 是無法調(diào)用 NewActivity 的 action 方法的

}

```

在 Java 里矗蕊,需要先使用 instanceof 關鍵字判斷類型短蜕,再通過強轉(zhuǎn)來調(diào)用:

```

void main() {

? ? Activity activity = new NewActivity();

? ? if (activity instanceof NewActivity) {

? ? ? ? ((NewActivity) activity).action();

? ? }

}

```

Kotlin 里同樣有類似解決方案,使用 is 關鍵字進行「類型判斷」傻咖,并且因為編譯器能夠進行類型推斷朋魔,可以幫助我們省略強轉(zhuǎn)的寫法:

```

fun main() {

? ? var activity: Activity = NewActivity()

? ? if (activity is NewActivity) {

? ? ? ? // 強轉(zhuǎn)由于類型推斷被省略了

? ? ? ? activity.action()

? ? }

}

```

那么能不能不進行類型判斷,直接進行強轉(zhuǎn)調(diào)用呢卿操?可以使用 as 關鍵字:

```

fun main() {

? ? var activity: Activity = NewActivity()

? ? (activity as NewActivity).action()

}

```

這種寫法如果強轉(zhuǎn)類型操作是正確的當然沒問題警检,但如果強轉(zhuǎn)成一個錯誤的類型,程序就會拋出一個異常害淤。

我們更希望能進行安全的強轉(zhuǎn)扇雕,可以更優(yōu)雅地處理強轉(zhuǎn)出錯的情況。

這一點窥摄,Kotlin 在設計上自然也考慮到了镶奉,我們可以使用 ==as?== 來解決:

```

fun main() {

? ? var activity: Activity = NewActivity()

? ? // '(activity as? NewActivity)' 之后是一個可空類型的對象,所以崭放,需要使用 '?.' 來調(diào)用

? ? (activity as? NewActivity)?.action()

}

```

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
禁止轉(zhuǎn)載哨苛,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者。
  • 序言:七十年代末币砂,一起剝皮案震驚了整個濱河市建峭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌道伟,老刑警劉巖迹缀,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蜜徽,居然都是意外死亡祝懂,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進店門拘鞋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來砚蓬,“玉大人,你說我怎么就攤上這事盆色』彝埽” “怎么了?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵隔躲,是天一觀的道長摩梧。 經(jīng)常有香客問我,道長宣旱,這世上最難降的妖魔是什么仅父? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上笙纤,老公的妹妹穿的比我還像新娘耗溜。我一直安慰自己,他們只是感情好省容,可當我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布抖拴。 她就那樣靜靜地躺著,像睡著了一般腥椒。 火紅的嫁衣襯著肌膚如雪阿宅。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天笼蛛,我揣著相機與錄音家夺,去河邊找鬼。 笑死伐弹,一個胖子當著我的面吹牛拉馋,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播惨好,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼煌茴,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了日川?” 一聲冷哼從身側響起蔓腐,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎龄句,沒想到半個月后回论,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡分歇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年傀蓉,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片职抡。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡葬燎,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出缚甩,到底是詐尸還是另有隱情谱净,我是刑警寧澤,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布擅威,位于F島的核電站壕探,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏郊丛。R本人自食惡果不足惜李请,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一派继、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧捻艳,春花似錦、人聲如沸庆猫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽月培。三九已至嘁字,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間杉畜,已是汗流浹背纪蜒。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留此叠,地道東北人纯续。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像灭袁,于是被迫代替她去往敵國和親猬错。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,077評論 2 355

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

  • 本文是在學習和使用kotlin時的一些總結與體會茸歧,一些代碼示例來自于網(wǎng)絡或Kotlin官方文檔倦炒,持續(xù)更新... 對...
    竹塵居士閱讀 3,294評論 0 8
  • 最近了解一下Kotlin,畢竟Google力挺软瞎,網(wǎng)上對于Kotlin褒貶不一逢唤,有吹捧的,也有貶低的涤浇,在拿不定主意的...
    JamFF閱讀 958評論 2 4
  • 1.extends 用 (冐號):代替鳖藕。MainActivity extends Activity, 現(xiàn)在是 Ma...
    JxMY閱讀 2,459評論 2 3
  • 目錄:一.環(huán)境搭建二.基礎語法1.函數(shù)定義2.可變參數(shù)3.定義常量與變量4.NULL檢查機制5.類型轉(zhuǎn)換三.基本類...
    豆小豆33閱讀 857評論 0 2
  • 寫在開頭:本人打算開始寫一個Kotlin系列的教程,一是使自己記憶和理解的更加深刻只锭,二是可以分享給同樣想學習Kot...
    胡奚冰閱讀 3,331評論 1 17