Kotlin快速入门5

Kotlin的继承与重写

kotlin的继承

Kotlin中所有类都继承自Any类,Any类是所有类的超类,对于没有超类型声明的类是默认超类(Any 不是 java.lang.Object):

class LearnKotlin  // 默认继承自Any

Any类默认提供三个函数

equals()hashCode()toString()

在kotlin中,除抽象类外的一个类可被继承要在class前添加open关键字进行修饰:

open class BaseClass(p: Int)           // 定义基类class ExtendsClass(p: Int) : BaseClass(p)

构造函数

1、子类有主构造函数

如果子类有主构造函数,则基类必须在主构造函数中立即初始化。示例如下:

open class Person(name : String, age : Int){}class Student(name : String, age : Int, var grade : String, var score : Int) : Person(name, age) {}

2、子类无主构造函数

如果子类无主构造函数,则必须在每一个次构造函数中用 super 关键字初始化基类,或者在代理另一个构造函数。初始化基类时,可以调用基类的不同构造方法。

class Student : Person {constructor(ctx: Context) : super(ctx) {}constructor(ctx: Context, attrs: AttributeSet) : super(ctx,attrs) {}
}

验证实例如下,先构造一个只有次构造函数的基类:

open class Person(name:String){/**次级构造函数**/constructor(name:String,age:Int):this(name){//初始化println("-------基类次级构造函数---------")}
}

再构造一个继承基类的子类,同时修改子类的次构造函数:

class Student:Person {constructor(name:String,age:Int,grade:String,score:Int):super(name, age){println("姓名: ${name}")println("年龄: ${age}")println("年纪: ${grade}")println("分数: ${score}")}
}

实例化Student对象,即刻看到打印信息:

fun main(args: Array<String>) {var student =  Student("Jack", 18, "13", 89)
}

控制台打印信息如下:

重写

在基类里,使用fun声明函数时,默认此函数有final修饰,不能被子类重写。如果想要这个方法可以被重写覆盖,就需要用open字段修饰这方法,同时在重写的方法前必须使用override修饰。如果没有使用open修饰,则子类不允许命名相同名字的函数。

class NetConfig : Base() {override fun draw() {   // 前面声明overridesuper.draw()}}open class Base {open fun draw() {}  //前面声明open
}

属性覆盖

和重写方法一样,需要重写的属性要用到open这个关键字,同时重写的属性需要用override来修饰。如果没有open来修饰属性,则子类不允许命名相同名字的属性:

open class Person{open val num : Int = 0
}
class Student: Person() {override var num = 10
}

这里要注意的是,你重写覆盖属性时,可以用一个var属性覆盖val属性,但反过来则不行。(一个val属性本质上是声明了一个get方法,而将其覆盖为 var 只是在子类中额外声明一个 set 方法,反之不行)。

当然,也可以直接在构造函数里覆盖属性:

open class Person{open val num : Int = 0
}
class Student(override var num: Int = 0): Person() {
}

覆盖规则

在kotlin中,如果基类有多个相同的方法(继承或者实现自其他类,如A、B类),则必须要重写该方法,使用super范型去选择性地调用基类的实现:

open class A {open fun f () { println("A") }fun a() { println("a") }
}interface B {fun f() { println("B") } //接口的成员变量默认是 open 的fun b() { println("b") }
}class C() : A() , B{override fun f() {super<A>.f()//调用 A.f()super<B>.f()//调用 B.f()}
}fun main(args: Array<String>) {val c =  C()c.f()
}

对应命令控制台输出如下:

由程序中可见,C 继承自 A 或 B, C 不仅可以从 A 或者 B 中继承函数,而且 C 可以继承 A()、B() 中共有的函数。

End,如有问题请留言。

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

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

相关文章

PyInstaller 将 Python 程序生成可直接运行的程序

图标转换地址&#xff1a;https://convert.app/#google_vignette 官方文档&#xff1a;https://readthedocs.org/projects/pyinstaller/downloads/pdf/stable/#page20 安装pyinstaller pip install pyinstaller执行打包 pyinstaller -i ./resource/w.icns -w -F whv.py --a…

开始学习第二十五天(番外)

今天分享一下写的小游戏啦 头文件game.h #include<stdio.h> #include<time.h> #include<stdlib.h> #define H 3 #define L 3 void InitBoard(char Board[H][L], int h, int l); void DisplayBoard(char Board[H][L], int h, int l); void playermove(cha…

幻兽帕鲁越玩越卡,内存溢出问题如何解决?

近期幻兽帕鲁游戏大火&#xff0c;在联机组队快乐游玩的同时&#xff0c;玩家们也发现了一些小问题。由于游戏有随机掉落材料的设定&#xff0c;服务器在加载掉落物的过程中很容易会出现掉帧、卡顿的情况。某些玩家甚至在游戏1&#xff5e;2时后就出现服务器崩溃的情况&#xf…

代码随想录算法刷题训练营day18

代码随想录算法刷题训练营day18&#xff1a;LeetCode(257)二叉树的所有路径、LeetCode(404)左叶子之和 LeetCode(257)二叉树的所有路径 题目 代码 import java.util.ArrayList; import java.util.List;/*** Definition for a binary tree node.* public class TreeNode {* …

代码小技巧

1、秒换算小时&分钟 int Time; int Hour,Minutes; HourTime/3600;//小时 Minutes(Time/60)%60;//分钟 Minutes(Time%3600)/60;//分钟 2、C当中比较大小 法一&#xff1a;利用库函数 int main() {int array[] { 5, 2, 9, 1, 7 }; cout << "最大值: "…

STP生成树协议实验

实验大纲 一、什么是生成树协议 二、生成树原理 1.STP工作原理 2.STP主要参数 3.STP根网桥 4.STP协议版本 三、实验 1.构建网络拓扑结构图 2.配置IP地址&#xff08;8台PC机&#xff09;&#xff1a;192.168.7.1~192.168.7.8 3.配置SW1 4.配置SW2 5.配置SW3 6.配置…

C++ 数论相关题目 求组合数IV

输入 a,b &#xff0c;求 Cba 的值。 注意结果可能很大&#xff0c;需要使用高精度计算。 输入格式 共一行&#xff0c;包含两个整数 a 和 b 。 输出格式 共一行&#xff0c;输出 Cba 的值。 数据范围 1≤b≤a≤5000 输入样例&#xff1a; 5 3 输出样例&#xff1a; 10 #…

蓝桥杯省赛无忧 课件51 第6次学长直播带练配套课件

01 最小的或运算 02 简单的异或难题 03 出列 04 异或森林 05 位移 06 笨笨的机器人 07 迷失的数 08 最大通过数

vue常用指令(v-mode)

一、v-mode 指令 作用: 获取和设置表单元素的值(实现双向数据绑定) 双向数据绑定 单向绑定: 就是把Model绑定到View&#xff0c;当我们用JavaScript代码更新Model时&#xff0c;View就会自动更新。双向绑定: 用户更新了View&#xff0c;Model的数据也自动被更新了&#xff0c;…

蓝牙----蓝牙消息传输_GATT服务发现

蓝牙消息传输_GATT服务发现 1.主机和从机GATT服务的发现2.通知的使用 1.主机和从机GATT服务的发现 GATT服务的发现由主机执行&#xff0c;一共三个阶段  1.处理交换 MTU 请求和响应&#xff0c;启动对 Simple Service 服务的发现。 if (discState BLE_DISC_STATE_MTU){// MT…

​ PaddleHub 首页图像 - 文字识别chinese_ocr_db_crnn_server​

PaddleHub 便捷地获取PaddlePaddle生态下的预训练模型&#xff0c;完成模型的管理和一键预测。配合使用Fine-tune API&#xff0c;可以基于大规模预训练模型快速完成迁移学习&#xff0c;让预训练模型能更好地服务于用户特定场景的应用 零基础快速开始WindowsLinuxMac Paddle…

【更新】ESG-71个工具变量汇总(2024)

一、引言 收集了CSSCI期刊文本数据&#xff0c;并对“ESG”相关期刊进行文本分析&#xff0c;统计了71个“ESG”相关的工具变量&#xff0c;希望对大家提升研究效率有所帮助 工具变量是一种在统计学和计量经济学中常用的技术&#xff0c;用于处理因果关系研究中的内生性问题。…

452. 用最少数量的箭引爆气球 - 力扣(LeetCode)

题目描述 有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points &#xff0c;其中points[i] [xstart, xend] 表示水平直径在 xstart 和 xend之间的气球。你不知道气球的确切 y 坐标。 一支弓箭可以沿着 x 轴从不同点 完全垂直 地射出。在坐标 …

带大家做一个,易上手的家常麻辣孜然牛蹄筋

首先 我们从冰箱中拿出牛蹄筋 泡水化开 一根大葱 一块生姜 大葱切段 生姜块 一把花椒 七个左右干辣椒 五个左右大料 三瓣蒜 切成蒜片 放入小碗中单独装起来 两个绿辣椒 首选螺丝椒 垃圾切成片 单独装起来 先将牛蹄筋 倒入锅中 然后加水 将牛蹄筋全部泡住即可 然后起锅烧…

RT-Thread: STM32 SPI使用流程

1.添加驱动 ①点开设置界面 ②勾选看门 SPI 驱动 ③点击保存 ④查看添加的驱动文件 drv_spi.c 2.打开驱动头文件定义 ①打开配置文件 ②打开定义 3.打开需要开启的SPI总线 打开 drivers 目录下的 board.h 用SPI搜索&#xff0c;找到如下文字&#xff0c;打开对应的宏。 /*-…

巴厘行记(四)——乌布漫游

欢迎览阅《巴厘行记》系列文章 巴厘行记巴厘行记&#xff08;一&#xff09;——海神庙 巴厘行记&#xff08;二&#xff09;——乌布之夜 巴厘行记&#xff08;三&#xff09;——Auntie和Mudi 巴厘行记&#xff08;四&#xff09;——乌布漫游 巴厘行记&#xff08;五&a…

Pytest单元测试框架

第一章、pytest概述 Pytest is a framework that makes building simple and scalable tests easy. Tests are expressive and readable—no boilerplate code required. Get started in minutes with a small unit test or complex functional test for your application or l…

深入理解与防范C语言中的栈溢出问题

一、引言 栈溢出是计算机安全领域中一个常见的漏洞&#xff0c;特别是在C语言编程中。由于C语言的灵活性和对内存管理的直接操作性&#xff0c;如果程序员在编写代码时不注意&#xff0c;就可能导致栈溢出的发生。本文将全面解析栈溢出的概念、原因、影响以及防范措施。 二、…

springboot+vue3支付宝接口案例-第二节-准备后端数据接口

springbootvue3支付宝接口案例-第二节-准备后端数据接口&#xff01;今天经过2个小时的折腾。准备好了我们这次测试支付宝线上支付接口的后端业务数据接口。下面为大家分享一下&#xff0c;期间发生遇到了一些弯路。 首先&#xff0c;我们本次后端接口使用的持久层框架是JPA。这…

3d合并模型是重名材质---模大狮模型网

当合并3d模型时&#xff0c;如果存在重名的材质&#xff0c;可能会导致加载问题。这是因为3D软件在处理重名材质时可能会出现冲突。你可以尝试以下方法解决这个问题&#xff1a; 重命名材质&#xff1a;检查合并的模型中的材质&#xff0c;确保它们具有唯一的命名。修改重名的材…