從零開始學(xué)Kotlin-類和對(duì)象(5)

定義一個(gè)類

  • 定義一個(gè)類,使用關(guān)鍵字class聲明,后面跟類名(不使用new)
    class demo5 {//定義一個(gè)類,使用關(guān)鍵字class聲明,后面跟類名

        fun test() {//類中定義方法
        }

        class empty//定義一個(gè)空類
    }

定義類的屬性

  • 類的屬性可以使用var和val定義
    class demo5 {
        var name: String = "SiberinDante"
        var age: Int = 18
        val gender: String = "男"
    }
  • 創(chuàng)建類的實(shí)例以及獲取類中的屬性
    class demo5 {
        var name: String = "SiberinDante"
        var age: Int = 18
        val gender: String = "男"
        fun test() {
            val user = demo5()//創(chuàng)建類demo5的實(shí)例
            print(user.name)//輸出name
        }
    }

類的修飾符: classModifier 和 accessModifier

  • classModifier: 類屬性修飾符,標(biāo)示類本身特性。
   abstract    // 抽象類  
   final       // 類不可繼承,默認(rèn)屬性
   enum        // 枚舉類
   open        // 類可繼承,類默認(rèn)是final的
   annotation  // 注解類
  • accessModifier: 訪問權(quán)限修飾符
    private    // 僅在同一個(gè)文件中可見
    protected  // 同一個(gè)文件中或子類可見
    public     // 所有調(diào)用的地方都可見
    internal   // 同一個(gè)模塊中可見

構(gòu)造器:

  • Koltin 中的類可以有一個(gè) 主構(gòu)造器,以及一個(gè)或多個(gè)次構(gòu)造器,主構(gòu)造器是類頭部的一部分,位于類名稱之后,主構(gòu)造器中不能包含任何代碼
    class consClass constructor(tag: String) {}
  • 主構(gòu)造器中不能包含任何代碼,初始化代碼可以放在初始化代碼段中,初始化代碼段使用 init 關(guān)鍵字作為前綴。
    class consClass constructor(name: String) {
        init {//初始化
        }
    }
  • 主構(gòu)造器的參數(shù)可以在初始化代碼段中使用,也可以在類主體n定義的屬性初始化代碼中使用。
    class consClass constructor(name: String) {
    init {
        print("My name is $name")
    }
    }
  • 次級(jí)構(gòu)造函數(shù),使用前綴 constructor修飾
    class cinsClass1 {
        constructor(age: Int, name: String) {}
    }
  • 如果類有主構(gòu)造函數(shù),每個(gè)次構(gòu)造函數(shù)都要直接或間接通過另一個(gè)次構(gòu)造函數(shù)代理主構(gòu)造函數(shù)。在同一個(gè)類中代理另一個(gè)構(gòu)造函數(shù)使用 this 關(guān)鍵字:
    class consClass constructor(name: String) {
        constructor(name: String, age: Int) : this(name) {
            print("name is $name,age is $age")
        }
        constructor(name: String, age: Int, gender: String) : this(name, age) {
            print("name is $name,age is $age,gender is $gender")
        }
    }
  • 構(gòu)造函數(shù)是 public 的,如果一個(gè)非抽象類沒有聲明構(gòu)造函數(shù)(主構(gòu)造函數(shù)或次構(gòu)造函數(shù)),它會(huì)產(chǎn)生一個(gè)沒有參數(shù)的構(gòu)造函數(shù)。如果你不想你的類有公共的構(gòu)造函數(shù),你就得聲明一個(gè)空的主構(gòu)造函數(shù):
    class consClass2 private constructor() {}
  • 在 JVM 虛擬機(jī)中,如果主構(gòu)造函數(shù)的所有參數(shù)都有默認(rèn)值,編譯器會(huì)生成一個(gè)附加的無參的構(gòu)造函數(shù),這個(gè)構(gòu)造函數(shù)會(huì)直接使用默認(rèn)值。

抽象類

  • 抽象類使用abstract修飾,抽象成員在類中不存在具體的實(shí)現(xiàn)。無需對(duì)抽象類或抽象成員標(biāo)注open注解。
    open class BaseClass {
        open fun baseVoid() {}
    }
    abstract class SecondClass : BaseClass() {
        override abstract fun baseVoid()
    }

嵌套類

  • 類中嵌套一個(gè)類
    class OuterClass {//外部類
        class NestedClass {//嵌套類
            fun showName() = "SiberiaDante"
        }
    }
    fun main(args: Array<String>) {
        val name = OuterClass.NestedClass().showName() // 調(diào)用格式:外部類.嵌套類.嵌套類方法/屬性
        println("name is $name")
    }

內(nèi)部類

  • 內(nèi)部類使用 inner 關(guān)鍵字來表示。內(nèi)部類會(huì)帶有一個(gè)對(duì)外部類的對(duì)象的引用,所以內(nèi)部類可以訪問外部類成員屬性和成員函數(shù)。
    class OuterClass1 {
        private val age: Int = 18
        var name = "成員屬性"
        inner class InnerClass { //內(nèi)部類
            fun showAge() = age  // 內(nèi)部類直接訪問外部類成員

            fun innerTest() {
                val outerCls = this@OuterClass1 //創(chuàng)建外部類的實(shí)例
                println("獲取外部類成員變量" + outerCls.name)//內(nèi)部類可以引用外部類的成員
            }
        }
    }
    fun main1(args: Array<String>) {
        val age = OuterClass1().InnerClass().showAge()
        println("My age is $age") 
        val demo2 = OuterClass1().InnerClass().innerTest()
        println(demo2)
    }

匿名內(nèi)部類

  • 使用對(duì)象表達(dá)式來創(chuàng)建匿名內(nèi)部類
    /**
     * 定義接口
     */
    interface TestInterface {
        fun testInterface()
    }
    class AnonymousClass {
        fun setInterFace(test: TestInterface) {
            test.testInterface()
        }
    }
    fun main2(args: Array<String>) {
        var anonymousClass = AnonymousClass()
        /**
         * 采用對(duì)象表達(dá)式來創(chuàng)建接口對(duì)象,即匿名內(nèi)部類的實(shí)例。
         */
        anonymousClass.setInterFace(object : TestInterface {
            override fun testInterface() {
                println("對(duì)象表達(dá)式創(chuàng)建匿名內(nèi)部類的實(shí)例")
            }
        })
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容