野菊花冬季枯萎吗?

小说:野菊花冬季枯萎吗?作者:密文华王更新时间:2019-05-24字数:12165

Kotlin中,接口(Interface)的使用和Java中的使用方式是有很大的区别。不管是接口中的属性定义,方法等。但是定义方式还是相同的。

目录

一、接口的声明

1、接口的声明

关键字:interface

定义格式:

interface 接口名{
    ...
}

2、使用

  • 关键字:冒号(:),这一点是和Java不同的。Java中使用接口使用的是implements关键字
  • Kotlin中冒号(:)使用的地方很多:
  1. 用于变量的定义
  2. 用于继承
  3. 用于接口
  4. 方法的返回类型声明

使用格式:

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

3、举例说明

fun main(args: Array<String>) {

   // 类的初始化
   var demo = Demo1()

   demo.fun1()
}

/**
 * 我定义的接口
 */
interface Demo1Interface{

    // 定义的方法
    fun fun1()
}

/**
 * 接口的实现类
 */
class Demo1 : Demo1Interface{
    override fun fun1() {
        println("我是接口中的fun1方法")
    }
}

输出结果为:

我是接口中的fun1方法

二、接口中的方法使用

  • 不带结构体的函数可以省略大括号,且不用强制重写带结构体的函数就可以直接调用。不太明白也没关系,下面的代码中都有注释。

例:

fun main(args: Array<String>) {
    var demo = Demo2()

    demo.fun1()
    demo.fun2(5)
    println(demo.fun3(10))
    println(demo.fun4())

    //可以不重写该方法直接调用
    demo.fun5()
}

interface Demo2Interface{

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

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

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

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

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

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

class Demo2 : Demo2Interface{

    override fun fun1() {
        println("我是fun1()方法")
    }

    override fun fun2(num: Int) {
        println("我是fun2()方法,我的参数是$num")
    }

    override fun fun3(num: Int): Int {
        println("我是fun3()方法,我的参数是$num,并且返回一个Int类型的值")
        return num + 3
    }

    override fun fun4(): String {
        println("我是fun4()方法,并且返回一个String类型的值")
   
        /*
            接口中的fun4()方法默认返回”fun4“字符串.
            可以用super.fun4()返回默认值
            也可以不用super关键字,自己返回一个字符串
        */
        return super.fun4()
    }

    /*
         接口中的fun5()带有结构体,故而可以不用重写,
         fun4()同样
    */

    //    override fun fun5() {
    //        super.fun5()
    //    }
}

输出结果为:

我是fun1()方法
我是fun2()方法,我的参数是5
我是fun3()方法,我的参数是10,并且返回一个Int类型的值
13
我是fun4()方法,并且返回一个String类型的值
fun4

三、接口中的属性使用

  • 在接口中申明属性。接口中的属性要么是抽象的,要么提供访问器的实现。接口属性不可以有后备字段。而且访问器不可以引用它们。

1、作为抽象

  • 即重写属性的时候是在实现类的类参数中。这也是用代码提示去重写的实现方法

例:

fun main(args: Array<String>) {
    var demo = Demo3(1,2)
    println(demo.sum())
}

interface Demo3Interface{

    val num1: Int

    val num2 : Int  
}

class Demo3(override val num1: Int, override val num2: Int) : Demo3Interface{
    fun sum() : Int{
        return num1 + num2
    }
}

输出结果为:

3

2、作为访问器

即手动方式去实现重写,并提供get()方法

例:

fun main(args: Array<String>) {
    println(demo.result())

    // 在这里也可以改变接口属性的值
    demo.num4 = 10
    println(demo.result())
}

interface Demo3Interface{

     // 声明比那俩和提供默认值
     // 注意: val num3: Int = 3  这种方式不提供,为直接报错的
    val num3: Int
    get() = 3

    val num4: Int
}

class Demo3(override val num1: Int, override val num2: Int) : Demo3Interface{

    // 提供访问器实现
    override val num3: Int
        get() = super.num3

    // 手动赋值
    override var num4: Int = 4

    fun result() : Int{
        return num3 + num4
    }
}

输出结果为:

7
13

四、接口的冲突问题解决

  • 该问题是指当我们在父类中声明了许多类型,有可能出现一个方法的多种实现。

例:

fun main(args: Array<String>) {

    // 类的初始化
    val demo = Demo4()

    demo.fun1()
    demo.fun2()
}

interface Demo4InterfaceOne{
    fun fun1(){
        println("我是Demo4InterfaceOne中的fun1()")
    }

    fun fun2(){
        println("我是Demo4InterfaceOne中的fun2()")
    }
}

interface Demo4InterfaceTwo{
    fun fun1(){
        println("我是Demo4InterfaceTwo中的fun1()")
    }

    fun fun2(){
        println("我是Demo4InterfaceTwo中的fun2()")
    }
}

class Demo4 : Demo4InterfaceOne,Demo4InterfaceTwo{

    override fun fun1() {
        super<Demo4InterfaceOne>.fun1()
        super<Demo4InterfaceTwo>.fun1()
    }

    override fun fun2() {
        super<Demo4InterfaceOne>.fun2()
        super<Demo4InterfaceTwo>.fun2()
    }

}

说明:Demo4实现了Demo4InterfaceOne和Demo4InterfaceTwo两个接口,而两个接口中都存在两个相同方法名的方法。因此编译器不知道应该选哪个,故而我们用super<接口名>.方法名来区分。

五、总结

Kotlin中,接口的重要性还是相当大的,不管是对代码的重构,还是项目的架构梳理。都占据一定的比重,故而学好接口是很有必要性的。当然,此篇文章只作为最入门级的文章,但是文章对一些用法写的比较详细。我也是参照官方文档写的。
项目源代码

如果各位大佬看了之后感觉还阔以,就请各位大佬随便star一下,您的关注是我最大的动力。
我的个人博客:Jetictors
我的简书:http://www.jianshu.com/u/9877d6088780

当前文章:http://780pk.com/news/2019041472032/index.html

发布时间:2019-05-24 04:26:41

哪里有骨里红梅树苗? 地径3公分黑松哪里有卖的? 长度70公分的欧月苗哪里有批发的? 河北有种植木瓜树的基地吗? 树桩月季好养吗? 哪里有萱草种植基地? 紫玉兰树苗基地低价批发紫玉兰 【老采购商】目前国内最好最便宜的紫叶李树苗产地信息 4公分紫竹多少钱能买到? 红枫树生长速度快吗?

17959 68525 40918 97039 80081 84897 81719 76675 51646 42720 71475 35286 82539 79380 10493 69549 90523 56531 51816 13154 22094 50153 93852

我要说两句: (0人参与)

发布