快速學習Kotlin(四)類與對象

Kotlin

Kotlin中的類

class Main{

}

class Main1 : AppCompatActivity(){

}

class Main2:AppCompatActivity(),View.OnClickListener{
    override fun onClick(v: View?) {
        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
    }

}

open class Main3{

}

open class Main4:AppCompatActivity(){

}

open class Main5:AppCompatActivity(),View.OnClickListener{
    override fun onClick(v: View?) {
        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
    }

}

上面代碼中我們聲明了五種類的寫法候生。

在Kotlin中定義一個類碟渺,必須使用class關鍵字來修飾(例如Main);

如果這個類有父類則使用 " : " 來代表繼承(例如Main1);

如果有多重繼承或者有接口來實例化則可以直接在后面用逗號來隔開處理泻骤,而無需寫implements來實現接口(例如Main2)闯睹,接口和父類可以沒有先后關系戏羽,先寫接口然后再寫父類也沒有任何的問題;

在kotlin中有一個關鍵字open楼吃,其代表這個類不為final始花。在kotlin中如果類沒有用open進行修飾,那么kotlin會默認這個類是一個被public final修飾的類孩锡。

構造函數

在kotlin中酷宵,如果想在類中寫入構造函數,并且在構造函數中傳遞參數躬窜,那么我們可以只寫在類的后面跟一個括號浇垦,在括號內填寫相應的參數。

class Person (name:String,age:Int){

    private var name:String;
    private var age:Int;

    init {
        this.name = name;
        this.age = age;
    }
}

我們看到荣挨,在Person這個類后面我們用括號括起來了兩個參數男韧。于是這便是向Person類寫入了一個構造函數朴摊,,而當我們想要在構造函數中執(zhí)行一些語句的話,我們便可以使用init這個關鍵字此虑,這個關鍵字中的語句會在我們執(zhí)行構造函數的時候同時執(zhí)行甚纲。在這里我們在init語句中將兩個參數進行賦值操作。

次級構造函數

當我們在寫一個類的時候可能有時候因為功能的不同朦前,會寫很多個構造函數贩疙。在kotlin中次級構造函數需要使用constructor來修飾,并且次級構造函數必須直接或間接的繼承主構造函數况既。

class Student constructor(username: String, age: Int) {

    private val username: String = username
    private var age: Int = age
    private var address: String
    private var isMarried: Boolean

    init {
        this.address = "Beijing"
        this.isMarried = false
    }

    constructor(username: String, age: Int, address: String) :this(username, age) {

        this.address = address
    }

    constructor(username: String, age: Int, address: String, isMarried: Boolean) : this(username, age, address) {

        this.isMarried = isMarried
    }

}

可以看到在代碼中这溅,我們寫了兩個次級構造函數,并且每個函數后面都直接或間接的繼承了主構造函數棒仍。

訪問修飾符

在kotlin中總共有四種訪問修飾符

  • private: 代表這個類中的成員是這個類私有的別的類不能進行訪問悲靴。

  • public: 代表這個類或者其他所有的類都能夠訪問的到。

  • protected: 代表這個類或者這個類的繼承類都可以訪問這個成員

  • internal: 此為kotlin中特有的修飾符莫其,其表示在這個模塊內都能訪問到這個對象癞尚,但是對于跨模塊卻不能訪問到。那么什么叫做模塊呢乱陡?在Android常用編輯器Android Studio中我們有時候會通過文件File去新建一個叫做module的浇揩,而這個module就是一個模塊。而被internal修飾的對象憨颠,只能在這個module中訪問胳徽,不能在其他module中訪問。

伴生對象

在Java中我們常常會去使用一些工具類爽彤,對于工具類的編寫养盗,一般都是直接在一個類中用static去修飾這個方法,然后通過類名.方法名直接調用适篙。

public class Utils {

    public static boolean isEmpty(String str){
        return str.equals("");
    }
}

但是在kotlin中是沒有static這個關鍵字的往核,那么在kotlin中該如何處理這種工具類的編寫呢?方法有兩種嚷节,

一種是之前講的聂儒,可以使用 @JvmStatic 來修飾工具類的方法然后直接調用。

object Utils{

    @JvmStatic
    fun isEmpty(str:String):Boolean {

        return str.equals("");
    }
}

fun test1(){
    Utils.isEmpty("test");
}

另外一種是使用伴生對象來進行修飾硫痰。

class Utils1{

    companion object {
        fun isEmpty(str:String):Boolean{
            return str.equals("");
        }
    }
}

fun test1(){

    Utils1.isEmpty("test");
}

伴生對象必須要在類中進行使用衩婚。用companion object兩個關鍵字進行聲明,后面用一個大括號括起來需要使用的函數碍论,使用的時候直接通過類名.函數名稱即可谅猾。

那么在Java中該如何調用這個kotlin中的伴生對象呢柄慰?其實也非常簡單鳍悠,可以使用類名 + Companion + 函數名即可税娜。

//java代碼

public class Utils {

    public void test(){
        Utils1.Companion.isEmpty("test");
    }
}

實際上,在kotlin中程序會通過Companion這個關鍵字在編譯的時候生成一個靜態(tài)的對象藏研,然后java通過這個靜態(tài)對象去調用Companion對象內部的一些函數敬矩。

編寫單例

在kotlin中編寫單例的方式有兩種,一種是通過object + @JvmStatic的方式來編寫單例蠢挡。而另外一種單例的編寫我們可以使用伴生對象來實現弧岳。


fun test1(){

    var get = SingletonDemo.get()
}

class SingletonDemo private constructor() {
    companion object {
        private var instance: SingletonDemo? = null
            get() {
                if (field == null) {
                    field = SingletonDemo()
                }
                return field
            }
        @Synchronized
        fun get(): SingletonDemo{
            return instance!!
        }
    }

}

看到,我們通過伴生對象來編寫了一個懶漢式的單例模式业踏。然后直接通過伴生對象的函數來獲取到SingletonDemo這個對象禽炬。

數據類——data

data可以說是在kotlin中常用的關鍵字。這個關鍵字一般是用來修飾一個類的勤家,被修飾的這個類自動會生成get()/set()方法腹尖、toString()方法、hashCode()方法伐脖、equals()方法以及copy()方法热幔,而不需要我們再特意去書寫這些常用的方法,大大節(jié)約了我們的書寫成本讼庇。

data class Person1(var name:String){

}

這里需要注意绎巨,被data修飾的類必須至少需要一個構造方法,且里面需要有至少一個參數蠕啄。如果沒有構造方法的類不能被data修飾或者被修飾了會報錯场勤。 這個其實也很好理解,因為被data修飾之后會有se()/get()方法歼跟,所以如果沒有構造方法來傳遞參數却嗡,那么set()/get()方法根本沒有用。另外嘹承,數據類是一個public final類型窗价,被data修飾的類不能再被open去修飾也不能等被繼承,不然程序會報錯叹卷。

如果覺得我的文章能夠幫助到你撼港,也歡迎關注我的微信公眾號「晨雨細曲」,有新技術和知識會推送在這上面骤竹。

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末帝牡,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子蒙揣,更是在濱河造成了極大的恐慌靶溜,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,946評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異罩息,居然都是意外死亡嗤详,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 95,336評論 3 399
  • 文/潘曉璐 我一進店門瓷炮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來葱色,“玉大人,你說我怎么就攤上這事娘香〔哉” “怎么了?”我有些...
    開封第一講書人閱讀 169,716評論 0 364
  • 文/不壞的土叔 我叫張陵烘绽,是天一觀的道長淋昭。 經常有香客問我,道長安接,這世上最難降的妖魔是什么响牛? 我笑而不...
    開封第一講書人閱讀 60,222評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮赫段,結果婚禮上呀打,老公的妹妹穿的比我還像新娘。我一直安慰自己糯笙,他們只是感情好贬丛,可當我...
    茶點故事閱讀 69,223評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著给涕,像睡著了一般豺憔。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上够庙,一...
    開封第一講書人閱讀 52,807評論 1 314
  • 那天恭应,我揣著相機與錄音,去河邊找鬼耘眨。 笑死昼榛,一個胖子當著我的面吹牛,可吹牛的內容都是我干的剔难。 我是一名探鬼主播胆屿,決...
    沈念sama閱讀 41,235評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼偶宫!你這毒婦竟也來了非迹?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 40,189評論 0 277
  • 序言:老撾萬榮一對情侶失蹤纯趋,失蹤者是張志新(化名)和其女友劉穎憎兽,沒想到半個月后冷离,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 46,712評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡纯命,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,775評論 3 343
  • 正文 我和宋清朗相戀三年西剥,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片扎附。...
    茶點故事閱讀 40,926評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡蔫耽,死狀恐怖结耀,靈堂內的尸體忽然破棺而出留夜,到底是詐尸還是另有隱情,我是刑警寧澤图甜,帶...
    沈念sama閱讀 36,580評論 5 351
  • 正文 年R本政府宣布碍粥,位于F島的核電站,受9級特大地震影響黑毅,放射性物質發(fā)生泄漏嚼摩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,259評論 3 336
  • 文/蒙蒙 一矿瘦、第九天 我趴在偏房一處隱蔽的房頂上張望枕面。 院中可真熱鬧,春花似錦缚去、人聲如沸潮秘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,750評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽枕荞。三九已至,卻和暖如春搞动,著一層夾襖步出監(jiān)牢的瞬間躏精,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,867評論 1 274
  • 我被黑心中介騙來泰國打工鹦肿, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留矗烛,地道東北人。 一個月前我還...
    沈念sama閱讀 49,368評論 3 379
  • 正文 我出身青樓箩溃,卻偏偏與公主長得像高诺,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子碾篡,可洞房花燭夜當晚...
    茶點故事閱讀 45,930評論 2 361

推薦閱讀更多精彩內容

  • 前言 人生苦多虱而,快來 Kotlin ,快速學習Kotlin开泽! 什么是Kotlin牡拇? Kotlin 是種靜態(tài)類型編程...
    任半生囂狂閱讀 26,218評論 9 118
  • 面向對象編程(OOP) 在前面的章節(jié)中惠呼,我們學習了Kotlin的語言基礎知識导俘、類型系統、集合類以及泛型相關的知識剔蹋。...
    Tenderness4閱讀 4,450評論 1 6
  • 嵌套類和內部類 大部分時候旅薄,類被定義成一個獨立的程序單元。在某些情況下泣崩,也會把一個類放在另一個類的內部定義少梁,這個定...
    凌寒天下獨自舞閱讀 488評論 0 0
  • Kotlin的類和接口與Java的類和接口是有一定的區(qū)別的凯沪。Kotlin的接口是可以包含屬性聲明。Kotlin默認...
    程自舟閱讀 10,340評論 0 11
  • 寫在開頭:本人打算開始寫一個Kotlin系列的教程,一是使自己記憶和理解的更加深刻杀赢,二是可以分享給同樣想學習Kot...
    胡奚冰閱讀 1,424評論 5 11