【Kotlin 三】封装/继承/多态 属性覆盖 类的扩展

1.封装/继承/多态

1.1 封装

一般,我们将类的属性都声明为private,在类中通过暴露一部分public的方法来供外部读写对象属性

class Student (private var name: String) {fun getName(): String {return name}fun setName(name: String) {this.name = name}
}

1.2 继承

默认的Kotlin类是终态(不可继承)的,可以使用open标记可以被继承的类

1.2.1 初始化顺序

存在继承关系时,初始化一个子类对象的顺序为:

父类初始化 > 子类主构造函数 > 子类次要构造函数

1.2.2 属性覆盖

子类需要重写父类的某些函数时,可以如下操作:

  1. 父类/父类方法 使用open修饰
  2. 子类使用override关键字修饰要重写的方法
open class Student {open fun hello() = println("我会打招呼")
}class ArtStudent : Student() {override fun hello() = println("哦哈哟")
}

可以使用is关键字判断某个对象是否是某个类的实现,类似于Java中的instance of

明确来了某个对象是哪个类以后,可以使用as关键字来强转

如果一个对象是可空类型(如Student?),可以使用as?进行强转,当对象为空时会直接返回一个null作为强转后的结果

2.类的扩展

常用的类扩展可以通过继承实现:子类可以在父类的基础上,通过定义更多的属性和方法来扩展父类的功能

Kotlin支持在类代码不对外开放/不能被继承的情况下,扩展类的功能,比如一些第三方类不向我们开放编辑权限,再或者本身就是Kotlin的一些基础类型(String)。这些类在Java语言中完全不能扩展,但是在Kotlin中可以

fun main() {val text = "1"text.test()
}fun String.test() = "111"

类的扩展是静态的(相对于多态是动态来说的),比如下面这个例子

open class Father
class Son : Father()fun Father.test() = "111"
fun Son.test() = "222"fun printObject(s: Father) {println(s.test())
}fun main() {printObject(Son())
}// 打印结果:111

因为是静态扩展,所以即使传入 printObject 的是一个子类对象,也是调用父类的扩展方法,这跟多态是不一样的。当扩展方法在贬义词出现歧义时,只会根据形参类型选择扩展函数

如果类中已经定义了一个函数,然后静态扩展了一个同名同形参函数,扩展函数会失效(类中原本定义的函数优先级更高)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/22831.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【长亭雷池WAF——“动态防护”功能深度体验】

前言: 在当今的网络安全环境中,Web应用防火墙(WAF)扮演着至关重要的角色。它们不仅能够防御常见的Web攻击,如SQL注入、跨站脚本攻击(XSS)等,还能够应对日益复杂的网络威胁。 长亭…

如何通过 6 种简单方法将照片从华为转移到 PC?

华为作为全球领先的智能手机供应商之一,最近推出了其自主研发的操作系统——HarmonyOS 2.0,旨在为智能手机、平板电脑和智能手表等设备提供更流畅的用户体验。随着Mate 40/P40等系列手机计划升级到HarmonyOS 2.0,用户可能需要将手机中的文件备…

CAM350如何快速删除Gerber文件上的东西?

文章目录 CAM350如何快速删除Gerber文件上的东西?CAM350如何快速保存已经修改的Gerber文件? CAM350如何快速删除Gerber文件上的东西? CAM如何导入Gerber文件见此篇 今天遇上了一个删除Gerber文件上部分字母的任务,CAM350只能一点点删除线的操作把我手指头差点按…

订单排队与链动模式塑造社交电商新格局

在数字化浪潮中,社交电商凭借其独特的魅力与潜力,正逐渐崭露头角。本文将解读一种融合了订单排队与链动模式的创新商业模式。这一模式旨在通过提高消费者复购率,优化销售流程,从而推动销售增长,塑造社交电商新生态。 …

Mybatis03-ResultMap及分页

1、属性名和字段名不一致问题 1.问题 数据库中的字段 新建一个项目Mybatis-04,拷贝之前,测试实体类字段不一致的情况 public class User {private int id;private String name;private String password; }select * from mybatis.user where id #{id} …

2024年宜昌中级工程师职称如何申报呢?

今年宜昌中级职称如何报名?怎么申报?申报时间是什么时候呢?报名条件是什么呢? 一、2024年宜昌中级职称申报条件:1.社保条件:在宜昌本地注册登记6个月以上民营企业,专业技术岗位从事工程技术工作…

苍穹外卖笔记-02-借助小乌龟创建gitee仓库,apifox代替YApi,Swagger

TOC 1 借助小乌龟创建gitee苍穹外卖仓库 这里建议看视频bilibili比特鹏哥视频 使用软件 git TortoiseGit https://git-scm.com/downloads https://tortoisegit.org/ 使用代码托管平台gitee,git的使用和gitee的账号创建需要查询其他资料 在一个从未克隆仓库的…

3389远程桌面,如何进行3389远程桌面的连接操作

随着信息技术的快速发展,远程桌面连接技术逐渐成为企业、教育以及个人用户进行远程办公、技术支持以及协作交流的重要工具。其中,3389远程桌面因其稳定性和易用性而备受青睐。本文将从专业角度出发,为您详细介绍如何进行3389远程桌面的连接操…

【名词解释】Unity中的Text组件及其使用示例

Unity中的Text组件是一个UI组件,它用于在游戏或应用程序中显示文本。Text组件可以显示静态文本,也可以动态地显示变量的值,如分数、时间、玩家名字等。Text组件是UI系统的一部分,通常与Canvas(画布)组件一起…

大模型产品的选择:独特优势与个人倾向

层出不穷的大模型产品,你怎么选? 随着近日腾讯元宝APP的正式上线,国内大模型产品又添一员。关于接连出现的“全能“大模型AIGC产品,你都用过哪些呢?不妨来分享一下你的使用体验吧!在这些大模型产品中&…

【React篇 】React项目中常用的工具库

我们可以从项目初始化、开发、构建、检查及发布的顺序总结react项目开发常用的工具库。 首先是初始化。 初始化工程项目一般用官方维护的 create-react-app,这个工具使用起来简单便捷,但 create-react-app 的配置隐藏比较深,修改配置时搭配…

LC 26删除有序数组中的重复项

去重题,双指针,,因为题干说原地删除,且nums其余元素不重要。一个cur记录当前不重复的数应该插在第几位了,for循环里的i相当于是第二个指针(右指针),遍历数组来找不重复的元素 class …

25-ARM-V7架构

运行模式 User(USR):用户模式 linux系统用户进程,资源访问受限System(SYS):系统模式 linux内核,共用寄存器,资源自由访问IRQ:一般中断模式 硬件产生中断信号…

数据结构:模拟队列

数据结构&#xff1a;模拟队列 题目描述参考代码 题目描述 输入样例 10 push 6 empty query pop empty push 3 push 4 pop query push 6输出样例 NO 6 YES 4参考代码 #include <iostream>using namespace std;const int N 100010;int q[N], hh, tt;int m, x; string …

【代码随想录算法训练Day29】LeetCode 491.非递减子序列、LeetCode 46.全排列、LeetCode 47.全排列II

Day29 回溯第五天 LeetCode 491.非递减子序列 这道题比起子集II来说又多了要考虑的点&#xff0c;首先我们不能排序来去重了&#xff0c;因为这样会增加很多不合题意的递增序列。所以我们使用set来去重。同时还要注意题目对答案子集要求内部元素的数量要大于1。 这个代码有一…

二分搜索树深度优先遍历

二分搜索树深度优先遍历 二分搜索树&#xff08;Binary Search Tree&#xff0c;简称BST&#xff09;是一种特殊的二叉树&#xff0c;它具有以下特性&#xff1a;对于树中的任意节点&#xff0c;其左子树中的所有元素都小于该节点的值&#xff0c;其右子树中的所有元素都大于该…

`combineLatest` 和 `zip` 都是 RxJava 中用来组合多个流的操作符,但它们在行为和使用场景上有一些显著的区别。

combineLatest 和 zip 都是 RxJava 中用来组合多个流的操作符&#xff0c;但它们在行为和使用场景上有一些显著的区别。 combineLatest combineLatest 操作符会在每个源 Flowable 发出一项数据后&#xff0c;合并最新发出的数据项&#xff0c;并且每当任意一个源 Flowable 发…

C++STL---list知识汇总

前言 学习完list&#xff0c;我们会对STL中的迭代器有进一步的认识。list底层有很多经典的东西&#xff0c;尤其是他的迭代器。而list的结构是一个带头双向循环链表。 list没有reserve和resize&#xff0c;因为它底层不是连续的空间&#xff0c;它是用时随时申请&#xff0c;…

windows 系统中部署 windows_exporter

从 github 中下载安装包到本地路径&#xff1a; Releases prometheus-community/windows_exporter (github.com) 后台运行方式windows_exporter&#xff0c;进入命令提示符执行以下命令&#xff1a; > powershell -Command "Start-Process D:\windows_exporter\wind…

快排与归并的算法(非递归版)

一.快排 1.递归法(方法多样) 1>hoare版 注&#xff1a;该方法小编已经在上篇博客中介绍过了&#xff0c;就不在这里过多赘述了&#xff0c;如果有兴趣的小伙伴可以看看小编的上篇博客哦 2>挖坑法 1&#xff09;方法介绍&#xff1a;定义最左边的数据为key&#xff0…