带你踏入Kotlin大门(六)|基本功_接口和特殊类篇

简介: 这篇文章是我们 Kotlin 基础章系列的最后一文了,前面我们利用了5篇文章讲解了 Java 开发者如何学好 Kotlin 的基本用法,每篇文章的篇幅都不长,可以在空余时间快速阅读,笔者希望学习完前五篇,再来学习这最后一篇文章,会更加的容易理解。

前置知识

  • 已学习 Kotlin 变量、函数和类的知识
  • Java 编程基础

前言

这篇文章是我们 Kotlin 基础章系列的最后一文了,前面我们利用了5篇文章讲解了 Java 开发者如何学好 Kotlin 的基本用法,每篇文章的篇幅都不长,可以在空余时间快速阅读,笔者希望学习完前五篇,再来学习这最后一篇文章,会更加的容易理解。

没有阅读前文也没关系,这一篇文章内容不会很难,我们可以很快的理解和学习。本篇将带大家学习 Kotlin 中的接口,以及如何使用接口实现解耦和接口隔离,还会学习一些 Kotlin 中独有的一些类。

Kotlin的接口

Java 中,我们会经常使用到接口,利用接口做一些抽象、解耦和规范等等。所以说,接口之于 Java,就如同关羽之于刘备一般,那么 Kotlin 含有接口这一特性的必要性也就不言而喻了。

首先,我们来看一下 Java 中的接口代码。(代码复用处)

public interface Flyable {
  void fly();
}
public class FlyAbility implements Flyable {
  @Override
  public void fly() { //... }
}
复制代码

下面,我们将这段代码转化为 Kotlin 代码。可以看出,接口的定义和 Java 基本是一致的,只是实现的关键字稍有不同,Kotlin 的实现关键字和继承是一样的,都是使用的冒号 :。还有一点不同的就是重写的注解,可以实现同行首位标明。

interface Flyable {
  fun fly()
}
class FlyAbility: Flyable{
    override fun fly(){
        //...
    }
}
复制代码

上面是接口的简单使用,下面我们可以使用其来实现多态和多重继承

多态

下面的 action 方法中,其参数声明的是接口类型,也理解为抽象类型;传入不同的实现该接口的实现类,即为实现了多态。这里的实现理念和 Java 中的多态也是一样的,我们只是做了一些不同语言语法的变更。

fun main(){
    val flyAbility = FlyAbility()
    action(flyAbility)
}
fun action(flyable: Flyable){
    flyable.fly()
}
复制代码

多重继承

我们所说的多重继承,是指优雅的实现多重继承。依旧是使用设计模式专栏里面的例子和代码,在此用 Kotlin 复现一次。

实现的方式是:组合+接口+委托。

如下方代码,使用这种方式,就可以利用组合和接口,完成各特性组合简单快捷且解耦的实现新类的特性了。

fun main(){
    val flyAbility = FlyAbility()
    action(flyAbility)
}
fun action(flyable: Flyable){
    flyable.fly()
}
//省略Tweetable/TweetAbility/EggLayable/EggLayAbility
class Ostrich: Tweetable, EggLayable {//鸵鸟
  val tweetAbility = TweetAbility(); //组合
  val eggLayAbility = EggLayAbility(); //组合
  //... 省略其他属性和方法...
  override fun tweet() {
    tweetAbility.tweet(); // 委托
  }
  override fun layEgg() {
    eggLayAbility.layEgg(); // 委托
  }
}
复制代码

关于接口的知识,我们还有一点需要注意的就是,Kotlin 的接口和 JDK1.8 之后的 Java 一样,可以实现在接口的抽象函数中,加入默认实现了。他们的使用是一样的,这里不再做过多赘述。

特殊类

Kotlin 中的特殊类其实是基于多年的 Java 业务经验衍生出来的。他把 Java 中最经常使用到的两种类进行默认实现,然后提供简单的使用给我们,帮助我们减少了很多的模板代码。这两种类就是 数据类和单例类

数据类

以往在 Java 中我们创建一个数据类,会借用一些插件,帮助我们编写 gettersetter 代码,还有实现 equals()hashCode()toString()这些代码。很多时候,我们的这些业务都是模板型的,不会有很多变化的。那么这些工作就会显得很多余,Kotlin 作为一门新的语言,对这个问题进行了解决,出现了数据类。

/* Java 实现
* private String cityName;
    private String cityId;
    private String cnty;
    private String location;
    private String parentCity;
    private String adminArea;
    private boolean isFavor;
*
* */
data class CityBean(
    var cityName: String = "",
    var cityId: String = "",
    var cnty: String = "",
    val location: String = "",
    val parentCity: String = "",
    var adminArea: String = "",
    val isFavor: Boolean = false
)
复制代码

上述的数据类中,已默认实现了上文提到的三个方法,直接使用即可。

单例类

单例模式是我们在开发中最常使用到的模式,而 Kotlin 有单例类这种特殊类,可以直接帮助我们实现单例模式。下面我们来看一下 Java 的实现和 Kotlin 中使用单例类的实现有何不同。

Java 实现(安全的懒汉模式)

public class SingleLazy {
    private static SingleLazy instance;
    private SingleLazy() {
    }
    public static synchronized SingleLazy getInstance() {
        if (instance == null) {
            instance = new SingleLazy();
        }
        return instance;
    }
    public void test(){
        //...
    }
}
复制代码

上述 Java 的实现,有接近10行代码,且是需要思考得出的。我们接下来看一下 Kotlin 中的实现。

//普通实现
class SingleLazy private constructor() {
    fun test() {
        //...
    }
    companion object {
        @get:Synchronized
        var instance: SingleLazy? = null
            get() {
                if (field == null) {
                    field = SingleLazy()
                }
                return field
            }
            private set
    }
}
//单例类
object SingleLazy {
    fun test() {
        //...
    }
}
复制代码

由上述的代码可以看到,我们只需要创建的时候,选择 object 类型即为创建单例类,只需短短几行代码即可实现单例模式。

那么它如何调用呢?调用方法类似于静态方法的调用,但事实上是 Kotlin 自动在全局创建了一个唯一的实例

SingleLazy.test()
复制代码

到此,这个 Kotlin 基础系列就已经全部讲完了。希望大家有所收获!


相关文章
|
10月前
|
分布式计算 Java 数据安全/隐私保护
Kotlin 学习笔记(二)—— 数据类、枚举类、循环、常用集合及操作符的写法(下 )
Kotlin 学习笔记(二)—— 数据类、枚举类、循环、常用集合及操作符的写法(下)
53 0
|
2月前
|
Kotlin
Kotlin类的定义、构造函数、封装、继承和多态
Kotlin类的定义、构造函数、封装、继承和多态
16 1
|
10天前
|
Kotlin
Kotlin 面向对象编程 (OOP) 基础:类、对象与继承详解
面向对象编程(OOP)是一种编程范式,它通过创建包含数据和方法的对象来组织代码。相较于过程式编程,OOP 提供了更快更清晰的结构,有助于遵守 DRY(Don't Repeat Yourself)原则,使代码更易于维护和扩展。在 Kotlin 中,类和对象是 OOP 的核心。类作为对象的模板,定义了对象的行为和状态;对象则是类的具体实例。例如,`Car` 类可以定义汽车的品牌、型号等属性,以及如驾驶和刹车等功能。通过构造函数可以快速初始化对象的属性。此外,Kotlin 支持继承机制,子类可以从父类继承属性和方法,促进代码重用。
20 2
|
2月前
|
存储 Java Kotlin
Kotlin中的嵌套类、内部类、枚举类、密封类、数据类、单例类、伴生对象
Kotlin中的嵌套类、内部类、枚举类、密封类、数据类、单例类、伴生对象
23 1
|
2月前
|
安全 Android开发 Kotlin
Android面试题之Kotlin的几种常见的类
这篇文章探讨了Kotlin编程语言中的初始化顺序、延迟初始化、惰性初始化、`lateinit`与`by lazy`的区别、初始化注意事项、继承、嵌套类、数据类、单例类和枚举类的使用,以及密封类的概念。文中通过示例代码详细解释了各种特性,并提醒读者关注初始化顺序和线程安全问题。同时,鼓励读者关注作者的公众号“AntDream”获取更多相关文章。
29 1
|
2月前
|
Kotlin
Kotlin中抽象类与接口
Kotlin中抽象类与接口
11 0
Android-kotlin-接口与多态的表现,面经解析
Android-kotlin-接口与多态的表现,面经解析
|
10月前
|
Java Kotlin
Kotlin 学习笔记(二)—— 数据类、枚举类、循环、常用集合及操作符的写法(上)
Kotlin 学习笔记(二)—— 数据类、枚举类、循环、常用集合及操作符的写法(上)
44 0
|
Kotlin
【Kotlin】Kotlin 类的继承 二 ( 属性覆盖 | 属性覆盖的四种情况 | 常量 / 变量 属性覆盖 | 子类初始化与属性覆盖 )
【Kotlin】Kotlin 类的继承 二 ( 属性覆盖 | 属性覆盖的四种情况 | 常量 / 变量 属性覆盖 | 子类初始化与属性覆盖 )
318 0
|
7天前
|
调度 Android开发 开发者
【颠覆传统!】Kotlin协程魔法:解锁Android应用极速体验,带你领略多线程优化的无限魅力!
【8月更文挑战第12天】多线程对现代Android应用至关重要,能显著提升性能与体验。本文探讨Kotlin中的高效多线程实践。首先,理解主线程(UI线程)的角色,避免阻塞它。Kotlin协程作为轻量级线程,简化异步编程。示例展示了如何使用`kotlinx.coroutines`库创建协程,执行后台任务而不影响UI。此外,通过协程与Retrofit结合,实现了网络数据的异步加载,并安全地更新UI。协程不仅提高代码可读性,还能确保程序高效运行,不阻塞主线程,是构建高性能Android应用的关键。
26 4