二晤锹、類(lèi)型初步

一. 類(lèi)和接口

  1. 類(lèi)的定義
    默認(rèn)為 public 可省略摩幔,類(lèi)內(nèi)無(wú)內(nèi)容可省略{}
class SimpleClass {
  var x : Int = 0 // 必須初始化
  constructor(x : Int){ // 構(gòu)造函數(shù)
    this.x = x
  }
}

可以簡(jiǎn)化為:

class SimpleClass ( var x : Int ){

}
  1. 類(lèi)的實(shí)例化
    可以省掉new
val simpleClass = SimpleClass(9)
println(simpleClass.x)
simpleClass.y()
  1. 接口的定義
    和Java沒(méi)有什么區(qū)別
interface SimpleInf {
  fun simpleMethod()
}

接口的實(shí)現(xiàn)

class SimpleClass(var x : Int) : SimpleInf {
  ...
  override fun simpleMethod(){
  }
}
  1. 抽象類(lèi)的定義
    和Java沒(méi)什么區(qū)別
abstract class AbsClass {
  abstract fun absMethod()
  open fun overridable(){}
  fun nonOverridable(){}
}

需要注意:kotlin 中它所有的類(lèi)默認(rèn)都是 final 的,那么就意味著不能被繼承抖甘,而且在類(lèi)中所有的方法也默認(rèn)是 final 的热鞍,不能被重寫(xiě),如果想要繼承或重寫(xiě),只需要在類(lèi)或方法前添加 open 關(guān)鍵字即可薇宠。

  1. 屬性引用
val ageRef = Person::age // 未綁定receiver
val person = Person(18,"Jone")// 綁定receiver
val nameRef = person.name
ageRef.set(person,20)
nameRef.set("Andy")

二. 擴(kuò)展方法

  1. 定義
    直接新建一個(gè) File 類(lèi)型的 kt 文件偷办,不是 class 類(lèi)型,不是 interface 類(lèi)型澄港,不是枚舉類(lèi)型椒涯,不是 Object 類(lèi)型,僅僅是 File 類(lèi)型回梧。
    可以定義擴(kuò)展方法废岂、擴(kuò)展屬性。
// 類(lèi)型可以省略狱意,即任意類(lèi)型
fun 類(lèi)型.方法名(參數(shù)...):返回值

// 任意類(lèi)型都可以調(diào)用
fun add(a: Int, b: Int): Int{
    return a + b
}

//只能 String 類(lèi)型可以調(diào)用
fun String.times(count: Int): String{
  ...
}

調(diào)用:

val a = 1
val b = 2
add(a, b)

val result: String
result.times(5)

三. 空類(lèi)型安全

  1. 可空類(lèi)型
    !! 強(qiáng)制轉(zhuǎn)換為不空類(lèi)型
    ?. 安全調(diào)用成員
    ?: 前面的表達(dá)式為null 則執(zhí)行后面的表達(dá)式
var nullable: String? = "Hello"

val length = nullable!!.length // !! 強(qiáng)制轉(zhuǎn)成不空類(lèi)型湖苞,如果你確定不可能為空,不然還是會(huì)空指針
//或
val length = nullable?.length ?:0 // elvis 安全訪(fǎng)問(wèn)
  1. 空類(lèi)型的繼承關(guān)系
    可空類(lèi)型為不可空類(lèi)型的父類(lèi)
var x: String = "Hello"
var y: String? = "World"

// x = y 详囤,不可以
// y = x财骨,可以

四. 智能類(lèi)型轉(zhuǎn)換

A as B 類(lèi)型轉(zhuǎn)換
A as? B 安全轉(zhuǎn)換,失敗返回 null

public interface Kotliner{}

public class Person implements Kotliner{
  public final String name;
  public final int age;

  public Person(String name, int age) {
    this.name = name;
    this.age = age;
  }
}

轉(zhuǎn)換:

val kotliner: Kotliner = Person("benny", 20)
if(kotliner is Person) {
  //println((kotliner as Person).name) // kotliner 自動(dòng)轉(zhuǎn)換類(lèi)型為Person
 println((kotliner as? Person)?.name) // 安全轉(zhuǎn)換
}

五. 建議

  1. 盡可能使用 val 來(lái)聲明不可變引用藏姐,讓程序的含義更加清晰確定隆箩;
  2. 盡可能減少函數(shù)對(duì)外部變量的訪(fǎng)問(wèn),也為函數(shù)式編程提供基礎(chǔ)羔杨;
  3. 必要時(shí)創(chuàng)建局部變量指向外部變量捌臊,避免因它變化引起程序錯(cuò)誤;

六. 案例

使用 Retrofit 發(fā)網(wǎng)絡(luò)請(qǐng)求

  1. 首先定義一個(gè)返回的數(shù)據(jù)結(jié)構(gòu)
data class Repository (
var id: Int,
var node_id: String,
var name: String,
var url: String
)
  1. 定義一個(gè)接口
interface GithubApi {
  @GET("/repos/{owner}/{repo}")
  fun getRepository(@Path("owner") owner: String, @Path("repo") repo: String): Call< Repository >  
}
  1. 使用
val gitHubApi = Retrofit.Build()
  .baseUrl("https://api.github.com")
  .addConverterFactory(GsonConverterFactory.create())
  .build()
  .create(GithubApi::class.java)

val response = gitHubApi. getRepository("JetBrains","Kotlin").execute()

val repository = response.body()

if (repository == null) {
  println("Error!${response.code()}-${response.message()}")
} else {
  println(repository.name)
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末兜材,一起剝皮案震驚了整個(gè)濱河市理澎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌护姆,老刑警劉巖矾端,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異卵皂,居然都是意外死亡秩铆,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)灯变,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)殴玛,“玉大人,你說(shuō)我怎么就攤上這事添祸」鏊冢” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵刃泌,是天一觀(guān)的道長(zhǎng)凡壤。 經(jīng)常有香客問(wèn)我署尤,道長(zhǎng),這世上最難降的妖魔是什么亚侠? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任曹体,我火速辦了婚禮,結(jié)果婚禮上硝烂,老公的妹妹穿的比我還像新娘箕别。我一直安慰自己,他們只是感情好滞谢,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布串稀。 她就那樣靜靜地躺著,像睡著了一般狮杨。 火紅的嫁衣襯著肌膚如雪母截。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,007評(píng)論 1 284
  • 那天禾酱,我揣著相機(jī)與錄音微酬,去河邊找鬼绘趋。 笑死颤陶,一個(gè)胖子當(dāng)著我的面吹牛佩伤,可吹牛的內(nèi)容都是我干的蕊温。 我是一名探鬼主播朱监,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼扮休,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼操灿!你這毒婦竟也來(lái)了蕉汪?” 一聲冷哼從身側(cè)響起盟蚣,我...
    開(kāi)封第一講書(shū)人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤刺覆,失蹤者是張志新(化名)和其女友劉穎绽族,沒(méi)想到半個(gè)月后姨涡,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡吧慢,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年涛漂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片检诗。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡匈仗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出逢慌,到底是詐尸還是另有隱情悠轩,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布攻泼,位于F島的核電站火架,受9級(jí)特大地震影響鉴象,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜何鸡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一炼列、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧音比,春花似錦俭尖、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至骚亿,卻和暖如春已亥,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背来屠。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工虑椎, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人俱笛。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓捆姜,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親迎膜。 傳聞我的和親對(duì)象是個(gè)殘疾皇子泥技,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345