首页 > 其他分享 >一文轻松掌握Kotlin接口与类

一文轻松掌握Kotlin接口与类

时间:2024-09-18 11:51:55浏览次数:3  
标签:String Kotlin age 接口 name say fun 一文

程序员常用的IDEA插件:https://github.com/silently9527/Toolkit

接口

Kotlin接口定义依旧使用interface

interface Animal {
    fun say()
}

class Dog : Animal {
    override fun say() {
        println("汪汪...")
    }
}
  1. Kotlin使用冒号来替代Java中的extend,implements
  2. Kotlin中override关键字是强制要求的,不能省略

Java中的接口允许拥有默认实现,Kotlin中也是同样支持的

interface Animal {
    fun say() = println("Animal say:^%&**&&")
}

现在让我们假设同样存在定义了一个say的实现Human,然后定义Man来实现这两个接口,默认Man会调用哪个say方法呢? 代码如下:

interface Human {
    fun say() = println("Human say:Hello")
}

class Man : Human, Animal {

}

测试后的接口过是任何一个都不会被调用,编译阶段就会报错,Man必须实现自己的say,

class Man : Human, Animal {
    override fun say() {
        super<Animal>.say();
        super<Human>.say();
    }
}
open,final,abstract

Java中只有显示的指定了final,才能够控制类和方法不被重写,这就有可能导致脆弱基类的问题(对基类的方法重写导致行为不正常),所以Kotlin中方法默认都是final, 如果需要支持重写需要使用手动使用open修饰

open class Man : Human, Animal {
    override fun say() {
        super<Animal>.say();
        super<Human>.say();
    }

    open fun walkSpeed() {
        println("walk quick")
    }
}

class OldMan : Man() {
    override fun say() {
        println("OldMan say:Hello, girl")
    }

    override fun walkSpeed() {
        println("walk slow")
    }
}

其中Man需要被继承所有需要使用open修饰, walkSpeed需要被重写也需要使用open修饰; 接口中的方法和抽象类中的抽象方法默认是open,无需在指定

可见性修饰符

Kotlin与Java中的可见性修饰符一样,使用public, private, protected, 但是默认值不同, Kotlin中默认值是public

内部类

与Java中的内部类区别在于Kotlin中的内部类默认情况下是不能够访问外部类的实例, 这和Java中的静态内部类很相似

class Woman : Human {
    override fun say() {
        val info = Info("Taomm", 21)
        println("Woman say: My name is ${info.name}, age is ${info.age}")
    }

    class Info(val name: String, val age: Int)
}

这里抽象出了个人信息的内部类Info, 但是在这个Info中是没有办法访问Woman中的成员,如果需要访问时需要使用关键字inner

class Woman : Human {
    val address: String = "Beijing";

    override fun say() {
        val info = Info("Taomm", 21)
        println("Woman say: My name is ${info.name}, age is ${info.age}, address is ${info.getAddress()}")
    }


    inner class Info(val name: String, val age: Int) {
        fun getAddress(): String = [email protected]
    }
}

访问外部类的时候需要通过this@Woman去操作

密封类

有时候需要把子类限制在父类中, 作为父类的内部类, 方便管理,这时候就需要使用关键字sealed修饰父类, sealed关键字隐含了这个类是open, 所以无需在显式添加open关键字

构造方法

Kotlin中构造方法使用关键字constructor, 如果需要调用重载的构造方法可以使用this(), 如果需要调用父类的构造方法可以使用supper()

class Person {
    var name: String
    var age: Int

    constructor(_name: String) {
        this(_name, 20)
    }

    constructor(_name: String, _age: Int) {
        name = _name
        age = _age
    }
}

在Java中经常会出现多个重载的构造方法, 与上面的两个构造方法类似, 在Kotlin中其实可以通过参数默认值以及参数命名替代掉,优化后的代码

class Person {
    var name: String
    var age: Int

    constructor(_name: String, _age: Int = 20) {
        name = _name
        age = _age
    }
}

fun main(args: Array<String>) {
    Person(_name = "Herman") //根据参数名字设置值
}

当我们的类只有一个构造函数的时候,可以继续简化,把成员属性和构造函数合并到一起

class Person (var name: String, var age: Int = 20)

类的初始化工作除了在构造函数中进行,还可以使用初始化语句块 init

class Person (var name: String, var age: Int = 20){
    init {
        //todo 初始化工作
    }
}

如果你想要自己的类不能够被其他代码创建,需要把构造方法标记为private

class Person private constructor(var name: String, var age: Int = 20)
  1. Kotlin中创建对象的时候不需要使用new关键字,直接调用构造方法即可.
  2. 如果一个类没有任何构造方法,与Java一样Kotlin默认也会生成一个无参的构造方法
接口中声明属性

Kotlin允许在接口中什么属性, 由于接口本身是不存储状态的,所以这个属性需要在子类来实现,具体是通过一个字段来存储,还是通过其他方式来获取就需要靠子类来实现

interface Human {
    val email:String
    val name:String
        get() = email.substringBefore("@")
}

这个接口可以看到,接口中的属性依然可以拥有getter/setter, name给了默认的getter, 那子类应该如何实现email属性呢?

  1. 直接通过一个变量来存储
class Man(override val email: String) : Human
  1. 提供getter
class Man : Human{
    override val email: String
        get() = getEmailFromDb()

    private fun getEmailFromDb(): String {
        TODO("database query")
    }
}
属性访问器(getter/setter)

Kotlin中类的属性默认都提供了getter/setter, 然后在使用的时候可以直接访问属性,无需像Java一样去调用getter、setter方法;

class Counter{
    var count:Int=0
        private set

    fun inc(){
        count++;
    }
}

这里定义了一个计数器,如果需要获取当前的计数可以直接访问属性Counter().count, 而count字段不能够被直接修改,只能调用inc方法,所以把这个setter设置成了private

原文链接: http://herman7z.site

最后(看完不点关注,你们想白嫖我吗)

文中或许会存在或多或少的不足、错误之处,有建议或者意见也非常欢迎大家在评论交流。

最后,写作不易,请不要白嫖我哟,希望朋友们可以点赞评论关注三连,因为这些就是我分享的全部动力来源

标签:String,Kotlin,age,接口,name,say,fun,一文
From: https://blog.51cto.com/u_15049004/12044844

相关文章

  • 设计一个高质量的API接口:提升应用性能的关键步骤
    在当今的软件开发世界中,API(应用程序编程接口)接口扮演着至关重要的角色。一个设计精良的API不仅能够提高开发效率,还能提升用户体验,并确保系统的可扩展性和安全性。本文将探讨如何设计一个高质量的API接口,并分析其对现代应用程序的重要性。什么是高质量的API接口?高质量的API接口通常......
  • M:接口耗时很短,页面数据回显慢?
    1、页面卡顿,需要好长一段时间才能加载完成,可能是资源请求过多,再加上请求响应慢的原因。每个浏览器都有资源请求并发数的限制,如何查看请求阻塞情况到前端如何针对该限制进行优化?先看问题:1、设置服务端请求耗时(3S)客户端并发调用20个请求。(预留问题-见下方:20个请求建立多少个TCP......
  • SpringBoot 如何利用异步接口,提高系统吞吐量
    一、前言Servlet3.0之前:每一次Http请求都由一个线程从头到尾处理。Servlet3.0之后,提供了异步处理请求:可以先释放容器分配给请求的线程与相关资源,减轻系统负担,从而增加服务的吞吐量。在springboot应用中,可以有4种方式实现异步接口:AsyncContextCallableWebAsyncTaskDeferredResult......
  • 前端大模型入门:掌握langchain的核心Runnable接口(一)
    在构建复杂的对话式AI应用程序时,Langchain是一个绕不开的工具,它帮助开发人员轻松地处理各种语言模型的集成与管理。v0.3是该框架的一个重要版本,它进一步优化了功能,提升了在JavaScript/TypeScript环境下的易用性。本文将介绍Langchainv0.3的核心功能,并特别着重于其Runnab......
  • 后台上传大文件时提示上传接口错误
    后台上传大文件时提示上传接口错误,通常有以下几个可能的原因:文件大小限制:服务器或框架对上传文件的大小有限制。内存限制:PHP或其他后端语言的内存限制。超时限制:上传大文件时可能会超过默认的执行时间限制。存储空间不足:服务器上的存储空间不足。网络问题:网络不稳定或中断......
  • D10【python接口自动化学习】-python基础之内置数据类型
    day10列表学习日期:20240917学习目标:内置数据类型--列表:如何处理同类数据?学习笔记:列表的定义创建列表#创建列表colours=['red','blue','green']print(colours)#将列表打印出来['red','blue','green']print(type(colours))#<class&#......
  • 【Arthas】记录一次使用Arthas优化接口速度的经历
    1.概述本日有个接口耗时1.2分钟,这个接口本身就是很慢的,但是想看看有没有能优化的地方。这个接口的能力就是获取kafka几个消费组的详情,并且判断是否延迟。这里我们主要使用Arthas的trace命令,使用的命令格式是traceservice实现类方法名称下面是排查过程[arthas@......
  • 微信授权登录接口开发
    微信登陆过程在项目开发中,难免会遇到微信授权登录这一操作,本讲来讲一下微信登陆是如何实现的?关于校验登录,有诸多方法,记录方法如下:使用SpringMVC提供的拦截器网关服务全局过滤器使用AOP面向横切面实现对于使用SpringMVC提供的拦截器来实现,其大致的思路如下:注意:用户......
  • go使用泛型实现接口通用结构体转换
    packagepagemodelimport("gitee.com/leijmdas/gobase/goconfig/common/base/basedto""gitee.com/leijmdas/gobase/goconfig/common/base/baseiface""gitee.com/leijmdas/gobase/goconfig/common/base/jsonutils""......
  • 第十一章 抽象类与接口
    一、抽象类和抽象方法抽象类:使用abstract修饰的类抽象方法:在类中没有方法体的方法,称为抽象方法,抽象方法用abstract修饰抽象类中可以没有抽象方法,包含抽象方法的类必是抽象类如果子类没有实现父类中的全部抽象方法,子类也必是抽象类没有抽象构造方法,抽象类不能被实例化抽象......