kotlin学习与实践类接口

Mauiie_娢 Mauiie_娢     2022-10-12     693

关键词:

1、类的继承结构

接口

* Kotlin的类和接口与Java的有些地方不一样:
* Kotlin的声明默认是public final的。
* Kotlin嵌套的类默认不是内部类:它没有包含对外部类的隐式引用 等
* Kotlin也一样是使用interface来声明接口
* 如下: 声明一个简单的接口
interface Clickable {
    fun click()
    fun longPress() = println("longPress")  //接口中的抽象方法也可以有默认的实现,有了默认的是现在之后实现类可以选择性的去重写
}

 实现接口:

* Kotlin在类后面加一个冒号来代替了Java的 implements 和 extends 关键字,
* 和Java一样的是,一个类可以实现任意多个接口,但是只能继承一个类.
* 与Java中的 @Override 注解类似,override 修饰符用来标注被重写的父类或者接口的方法和属性,
* 与Java不同的是 override 修饰符是强制要求的,
class Button : Clickable {
    override fun click() {
        println("Button is clicked")
    }
}

  

* Kotlin 接口中的方法也可以有个默认的实现,与Java 8 要求在这样的方法前加default 关键字不同的是:Kotlin 不要加任何多余的关键字
* 只需要提供一个方法体就好了
interface Clickable_0 {
    fun click()
    /**
     * 这个方法提供了一个默认的实现,如果实现这个接口,可以选择重新定义它,也可以直接只用它
     */
    fun showOff() = println("I‘m Clickable")
    fun show() = println("show")
}

 

*  下面的Focusable 接口中也有一个方法 showOff ,如果一个类同时实现了 Clickable_0 和 Focusable 俩接口,就必须显示的实现showOff
* 否则会编译错误 Class ‘Button_0‘ must override public open fun showOff(): Unit defined in com.mauiie.kotlin.chapter3ClassObjectInterface.Clickable_0 because it inherits multiple interface methods of it
interface Focusable {
    fun setFoucus(b: Boolean) {
        println("I ${if (b) " got " else " lost "} focus.")
    }

    fun showOff() = println("I‘m Focusable")
    fun show() = println(" show !")
}
Button_0 同时实现了上面的两个接口:
class Button_0 : Clickable_0, Focusable {
    override fun click() {
        println("Button is clicked")
    }

    /**
     * 因为Clickable_0, Focusable 都定义了showOff 方法,所以这里必须显示的实现
     */
    override fun showOff() {
        /**
         * 使用尖括号加上父类型的名字的“super”表示想要调用哪一个父类的的方法(默认实现)
         * */
        super<Clickable_0>.showOff()
        super<Focusable>.showOff()
    }

    override fun show() = super<Focusable>.show()
}

 

open、final、抽象类

* Java的类和方法默认是open的,这样默认子类可以任意修改默认类的默认方法个属性
* Kotlin中的类个方法默认都是final的,这样可以规避“脆弱基因”问题
* 如果你想创建一个类的子类,需要使用open 关键字来修饰这个类,此外需要给每一个可以被重写的属性或方法添加一个open修饰符

* 这个类是open的,所以其它类可以继承它
* 如果你重写了一个基类或者接口的成员(方法),默认它也是open的,如果你不想让子类在重写这个方法,就需要显示的将重写的成员标注为 final 的
open class RichButton : Clickable {
    /**
     * 这个方式final的,不能在子类中重写它
     */
    fun disable() {}

    /**
     * 这个方法是open的,可以在子类中重写它
     */
    open fun animate() {}

    /**
     * 这个方法是重写的一个open的方法,并且他本身也是open 的,子类可以重写它
     */
    override fun click() {
        println(" RichButton click ")
    }

    /**
     * 这个重写的方法添加了 final,所以子类肯定不能重写它
     */
    final override fun longPress() {
        super.longPress()
    }
}

  

* 在Kotlin中,同Java一样可以声明一个类为abstract的,这种抽象类不能被实例化。
* 一个抽象类通常包含一些没有实现并且必须在子类重写的抽象成员。抽象成员始终是open的,所以不需要显示的使用open修饰符
abstract class Animated {
    /**
     * 抽象方法没有被实现,它必须被子类所实现,默认是open的,这里的也可以用open修饰(多此一举)
     */
    abstract fun animate()

    /**
     * 抽象类中的非抽象方法默认是final的,但是也可以用open修饰以便子类重写
     */
    open fun stopAnimating() {}

    /**
     * 没有用open修饰的非抽象方法则不能被子类所重写
     */
    fun animateTwice() {}

}

可见性修饰符、内部类

* Kotlin中的可见性修饰符与Java中的类似。可以使用public、protected和private修饰符。
* 但是与Java不同的是Kotlin 默认是public的,Java默认的包私有性Kotlin并没有沿用,Kotlin只把包作为在命名空间里组织代码的一种方式使用,没有将其用作可见性控制。
* 作为替代方案Kotlin提供了一种新的修饰符“internal”,表示“只在模块内部可见”。一个模块就是一组一起编译的Kotlin文件。
* internal可见性的优势在于它提供了对模块实现细节的真正封装。
* 另一个区别就是Kotlin允许在顶层声明中使用private可见性,包括类、函数、和属性。这些声明就会只在声明他们的文件中可见。
internal open class TalktiveButton : Focusable {
    private fun yell() = println("Hey!")
    protected fun whisper() = println("Let‘s Talk")
}

 

* 像Java一样,Kotlin 也支持在一个类中直接声明另一个类,区别是在Kotlin 中直接声明在类中的嵌套类不能访问外部类的实例,除非你做出了要求

 

interface State : Serializable

interface View {
    fun getCurrentState(): State
    fun restoreState(state: State) {}
}

/*JAVA 的演示实例请参照 JavaCallTest*/

/**
 * Kotlin 没有显示修饰符修饰的内部类与Java中的static 嵌套类是一样的,不会持有外部类的引用。
 */
class Button2 : View {
    override fun getCurrentState() = ButtonState()

    override fun restoreState(state: State) {
        super.restoreState(state)
    }

    class ButtonState : State {
    }
}
* 如果想让他变成内部类就必须加上inner 修饰符,这样才会只有外部类的引用。
* Kotlin中在内部类中引用外部类的语法也与Java不同 使用:[email protected]从内部类去访问外部类
class Outer {
    inner class Inner {
        fun getOuterReference(): Outer = [email protected]
    }
}

  

sealed封闭类

* 为了解决子类可以随便任意的父类而导致无法约束子类的实现类问题。Kotlin推出了sealed关键字 sealed(密封、封闭),
* 为父类添加一个sealed修饰符,对可能创建的子类做出严格的限制。所有的直接子类必须嵌套再父类中。
* 注意 sealed 修饰符隐含的这个类是open的,不要在显示地添加open修饰符
/**
 *  使用sealed 标记类为封闭的
 */
sealed class Expr {
    //将所有的实现子类作为嵌套类列举出来
    class Num(val value: Int) : Expr()

    class Sum(val left: Expr, val right: Expr) : Expr()
}
这样当在when 循环中列举出所有的可能的实现子类之后就不需要在检查默认的分支(因为封闭类已经列举出所有可能的实现子类)
fun eval(e: Expr): Int = when (e) {
    is Expr.Num -> e.value
    is Expr.Sum -> eval(e.left) + eval(e.right)
}
//!!使用冒号实现接口的时候 直接 :Interface
//!!使用冒号集成父类的时候 直接 :ParentClass()

kotlin学习与实践fun函数

通过例子来学习如何高效的在Kotlin中定义使用函数。1、命名参数、默认参数、顶层函数、扩展函数*展示几种创建集合类的方法和扩展的简单操作集合类的方法funcreateCollection(){valset=hashSetOf(1,12,26)println("hashSetOf-->${set.javaClass}")va... 查看详情

kotlin学习与实践基础

...外层,不需要把它放入类中。*d.数组就是类。和Java不同Kotlin没有声明数组类型的特殊语法。*f.使用println代替了System.out.println。    Kotlin标准库给Java的标准库函数提供了许多语法更简洁的包装,而println就是其中一个。*g 查看详情

kotlin基础知识汇总(知识与实践相结合)

2个月的时间总算把Kotlin的基础知识写完了,下面咱们看看具体内容:学习Kotlin的必要性【Kotlin初学者】为什么要学Kotlin 【Kotlin初学者】打牢基础的重要性运行环境【Kotlin初学者】AndroidStudio运行main函数报错解决基础知识... 查看详情

kotlin学习与实践构造方法

*在Java中可以声明一个或多个构造方法。Kotlin也是一样的,只是做了一点修改:*区分了主构造方法(通常是主要而简洁的初始化类的方法,并且声明在类外部声明)和从构造方法(在类的内部声明)*同样也允许在初始化语句块... 查看详情

kotlin学习与实践lambda

...a来说从Java8才引入Lambda,所以这里还是提一下Lambda。而且Kotlin中使用Lambda的确很赞。Lambda表达式简称lambda,本质上就是一段可以传递给其他函数的一小段代码,可以轻松的把通用的代码结构抽取成库函数。*函数式编程可以把函... 查看详情

kotlin学习与实践kotlin的可控性

...的值,以及在该类型值上可以完成的操作。*与Java不同,Kotlin对可空类型的显示的支持。可空类型是Kotlin类型系统中帮助避免NullPointException错误的特性。*这是一种指出你的程序中那些变量和属性允许为null的方式。*可空类型和非... 查看详情

kotlin学习笔记——接口抽象类泛型扩展集合操作符与java互操作性单例(代码片段)

注:编码工具为IntelliJ目录接口示例定义变量示例变量默认值抽象类示例实现接口泛型泛型类泛型函数泛型实现自定义map变换泛型类联合泛型函数实现泛型函数实现类型约束泛型vararg参数vararg示例泛型vararg类型判断out和in关键... 查看详情

kotlin学习笔记之面向对象(代码片段)

...ff0c;使用interface表示,示例代码:与java一样,kotlin定义类时要遵循单继承多实现的原则(即只能继承一个父类,可以实现多个接口)kotlin中定义的类和方法默认都是final的,不可重写,如果要实现重... 查看详情

kotlin基础知识汇总(知识与实践相结合)

2个月的时间总算把Kotlin的基础知识写完了,下面咱们看看具体内容:学习Kotlin的必要性【Kotlin初学者】为什么要学Kotlin【Kotlin初学者】打牢基础的重要性运行环境【Kotlin初学者】AndroidStudio运行main函数报错解决基础知识... 查看详情

kotlin语法学习(代码片段)

文章目录Kotlin语法学习(二)面向对象编程类和对象继承和构造函数接口访问修饰符数据类和单例Kotlin语法学习(二)面向对象编程类和对象创建一个Person类openclassPerson/***姓名*/varname=""/***年龄*/varage=0/***人的吃饭方法*/fune... 查看详情

kotlin基础类对象和接口

 类、对象和接口一、定义类的继承结构一)Kotlin中的接口Kotlin的接口与Java8中相似,它们可以包含抽象方法的定义以及非抽象方法的实现,但它们不能包含任何状态。1interfaceClickable{2funclick()3funshowoff()=println("It‘sshowtime!")4}56i... 查看详情

kotlin学习笔记之面向对象(代码片段)

...ff0c;使用interface表示,示例代码:与java一样,kotlin定义类时要遵循单继承多实现的原则(即只能继承一个父类,可以实现多个接口)kotlin中定义的类和方法默认都是final的,不可重写,如果要实现重... 查看详情

kotlin学习——数据类,泛型,嵌套类与内部类,对象表达式和对象声明(代码片段)

一.数据类数据类和JAVA中的javabean类似,只作用于保存一些数据,所以如果创建,会默认生成一些函数,并且会被标记为data:equals()/hashCode()toString()componentN()copy()我们来看下标准的写法dataclassUser(valname:String,valage:Int)... 查看详情

kotlin接口

Kotlin接口与Java8类似,使用interface关键字定义接口,允许方法有默认实现:interfaceMyInterfacefunbar()//未实现funfoo()//已实现//可选的方法体println("foo")实现接口一个类或者对象可以实现一个或多个接口。classChild:MyInterfaceoverridefunbar()//... 查看详情

kotlin学习之类与对象继承与构造函数(代码片段)

类与对象首先创建一个Person类。右击包→New→KotlinFile/Class,在弹出的对话框中输入“Person”。对话框在默认情况下自动选中的是创建一个File,File通常是用于编写Kotlin顶层函数和扩展函数的,我们可以点击展开下拉列... 查看详情

kotlin中数据类和单例类的实现和讲解面向对象编程接口的实现(代码片段)

1.数据类和单例类在开始学习之前,先来学习一下Kotlin语言中的可见性修饰符:熟悉Java的人都知道,Java中有4种可见性修饰符,public、private、protected、default。 kotlin种也有4种,分别是public、private、protected、internal。首先private修饰... 查看详情

kotlin数据类与密封类(代码片段)

/***主构造函数至少包含一个参数*所有的主构造函数的参数必须标识为val或者var*数据类不可以声明为abstractopen、sealed或者inner*数据类不能继承其他类,但是可以实现接口*///关键字为datadataclassUser(valname:String,valage:Int)//funcopy(name:Str... 查看详情

java学习笔记3.7.2抽象类接口与多态-接口

文章目录零、本讲学习目标一、老版本接口定义二、JDK8接口定义(一)接口定义语法格式(二)接口语法定义说明三、接口案例演示(一)接口的定义与实现1、创建形状接口2、创建圆类,实现形状接口3、创建测试类4、课堂练... 查看详情