Day06抽象、接口、嵌套、数据类、密封、枚举

1、抽象类
2、接口类
3、内部类(嵌套类)
4、数据类
5、密封类
6、枚举类

关键字:冒号(:)
在Kotlin中冒号 : 使用的地方很多:
 用于变量的定义
 用于继承
 用于接口
 方法的返回类型声明

抽象类

1、关键字为:abstract
2、定义格式

abstract class  抽象类名{
    ...
}

3、使用格式

class 类名 : 抽象类名{
    // 重写的抽象类函数、属性等
    ...
}

注意事项
 1、抽象可以分为抽象类、抽象函数、抽象属性。而一个抽象类和普通类的区别在于抽象类除了可以有其自己的属性、构造函数、方法等组成部分,还包含了抽象函数以及抽象属性。
 2、抽象类不能直接被实例化,需要依靠子类采用向上转型的方式实例化。
 3、子类必须全部重写带abstract修饰的属性和方法。
 4、抽象类是为其子类定义了一个模板,同是类实现不同的功能。
 5、抽象类可以继承自一个继承类,即抽象类可以作为子类。不过,抽象类建议不用open修饰符修饰,因为可以覆写抽象类的父类的函数。

fun main(args: Array<String>) {
    var student = Student()
    student.name = "kotlin"
    println(student.name)
    student.eat()
}

class Student : Person() {
    override fun initAn() {

    }

    override var name: String = ""
    override fun eat() {
        println("实现抽象方法")
    }

}

abstract class Person : Animal() {
    var sex: String = ""//自身属性
    fun showMesg() {//自身方法
    }

    abstract var name: String           // 抽象属性
    abstract fun eat()                  // 抽象方法

    abstract override fun initAn()       //父类抽象方法

}

open class Animal {
    open fun initAn() {}
}

结果图:


结果图

接口类

1、关键字:interface
2、定义格式

interface 接口名{
    ...
}

3、使用格式

class 类名 : 接口名{
    // 重写的接口函数、属性等
    ...
}

注意事项
 1、不带结构体的函数可以省略大括号。
 2、带结构体的函数,可以不重写,直接可以调用。

fun main(args: Array<String>) {
    var student = Student()
    student.fun1()
    student.fun2(12)
    student.fun3(13)
    student.fun4()
    student.fun5()
}

class Student : Person {
    override fun fun1() {
        println("我是fun1")
    }

    override fun fun2(num: Int) {
        println("我是fun2")
    }

    override fun fun3(num: Int): Int {
        println("我是fun3")
        return num
    }
    
}

interface Person {
    // 定义一个无参数无返回值的方法
    fun fun1()

    //定义一个有参数的方法
    fun fun2(num: Int)

    //定义一个有参数有返回值的方法
    fun fun3(num: Int): Int

    // 下面的两个方法是有结构体, 故可以不重写

    //定义一个无参数有返回值的方法
    fun fun4(): String {
        println("我是fun4")
        return "fun4"
    }

    //定义一个无结构体函数,大括号是可以省略的
    fun fun5() {
        // 如果函数中不存在表达式,大括号可以省略。
        // 如fun1一样
        println("我是fun5")
    }
}

结果图:


结果图

嵌套类

1、即指一个类可以嵌套在其他类中
2、调用嵌套类的属性或方法的格式为:外部类.嵌套类().嵌套类方法/属性。在调用的时候嵌套类是需要实例化的。
3、嵌套类不能使用外部类的属性和成员。

fun main(args: Array<String>) {
    var xiaoMing = Student.XiaoMing()  // 调用格式为:外部类().内部类().内部类方法/属性
    xiaoMing.eat()

}
class Student {//外部类

    var name: String = ""

    class XiaoMing { //嵌套类
        fun eat() {
            println("小明吃苹果")
        }
    }

}

内部类

1、关键字:inner
2、声明格式:

inner class 类名(参数){}

3、调用内部类的属性或方法的格式为:外部类().内部类().内部类方法/属性。在调用的时候嵌套类是需要实例化的。
4、内部类不能使用外部类的属性和成员。

fun main(args: Array<String>) {
    var xiaoMing = Student().XiaoMing()  // 调用格式为:外部类().内部类().内部类方法/属性
    xiaoMing.eat()

}

class Student {//外部类

    var name: String = ""

    inner class XiaoMing { //嵌套类
        fun eat() {
            println("小明吃苹果")
        }
    }

}

匿名内部类

1、在开发中,匿名内部类随处可见。比如说Button的OnClickListener,ListView的单击、长按事件等都用到了匿名内部类。

fun main(args: Array<String>) {
    var student = Student()

    student.setOnClickListener(object : OnClickListener {
        override fun onItemClick(positon: Int) {
            println("匿名内部类")
        }

    })
    student.testListener()
}

class Student {

    lateinit var listener: OnClickListener

    fun setOnClickListener(listener: OnClickListener) {
        this.listener = listener
    }

    fun testListener() {
        listener.onItemClick(0)
    }
}

interface OnClickListener {
    fun onItemClick(positon: Int)
}

数据类

在Java中,或者在我们平时的Android开发中,为了解析后台人员给我们提供的接口返回的Json字符串,我们会根据这个字符串去创建一个类或者实例对象,在这个类中,只包含了一些我们需要的数据,以及为了处理这些数据而所编写的方法。这样的类,在Kotlin中就被称为数据类。
1、关键字:data
2、声明格式:

data class 类名(var param1 :数据类型,...){}

或者:

data class 类名 可见性修饰符 constructor(var param1 : 数据类型 = 默认值,...)

3、data为声明数据类的关键字,必须书写在class关键字之前。
4、在没有结构体的时候,大括号{}可省略。
5、构造函数中必须存在至少一个参数,并且必须使用val或var修饰。
6、参数的默认值可有可无。(若要实例一个无参数的数据类,则就要用到默认值)
数据类的特性:
 1、主构造函数需要至少有一个参数
 2、主构造函数的所有参数需要标记为 val 或 var;
 3、数据类不能是抽象、开放、密封或者内部的;
 4、数据类是可以实现接口的,如(序列化接口),同时也是可以继承其他类的,如继承自一个密封类。

fun main(args: Array<String>) {
    var student = Student("kotlin",10,"nv")
    println(student.toString())

}

data class Student(var name:String,
                   var age:Int,
                   var sex:String) {

}

密封类

密封类用来表示受限的类继承结构:当一个值为有限几种的类型, 而不能有任何其他类型时。
1、关键字:sealed
2、用来表示受限的类继承结构。
3、密封类是不能被实例化的
4、密封类可以有子类,但是所有的子类要内嵌在密封类中。
5、子类可以定在密封类外部,但是必须在同一文件中 v1.1之前只能定义在密封类内部。

fun main(args: Array<String>) {
    var student = Person.Student("aaa")
    var student1 = Person.Student("bbb")
    println(student)
    println(student1)

}


sealed class Person {
    data class Student(var name: String) : Person()
    object Doctor : Person()//单例模式
}

object Worker : Person() {

}

枚举类

1、关键字:enum
2、声明格式:

enum class 类名{
      ...
}

3、访问格式:
  枚举类名.枚举常量.属性
4、每一个枚举都是枚举类的实例,所以他们可以是初始化过的。
5、要实现枚举常量的匿名类,则必须提供一个抽象方法(必须重写的方法)。且该方法定义在枚举类内部。而且必须在枚举变量的后面。
6、枚举变量之间使用逗号(,)分割开。但是最后一个枚举变量必须使用分号结束。不然定义不了抽象方法。

fun main(args: Array<String>) {

    println(Person.BLACK.argb)
    Person.BLACK.print()
}

enum class Person(var argb: Int) {
    RED(0) {
        override fun print() {
            println("RED")
        }
    },
    WHITE(1) {
        override fun print() {
            println("WHITE")
        }
    },
    BLACK(2) {
        override fun print() {
            println("BLACK")
        }
    };

    abstract fun print()
}

----------------------------THE END-------------------------

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,753评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,668评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,090评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,010评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,054评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,806评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,484评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,380评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,873评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,021评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,158评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,838评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,499评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,044评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,159评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,449评论 3 374
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,136评论 2 356

推荐阅读更多精彩内容