Kotlin学习历程——继承

分享下学习Kotlin的历程-构造函数/抽象类/枚举 转载请注明出处:王亟亟的大牛之路开篇之前还是老规矩,先安利https://github.com/ddwhan0123/Useful-Open-Source-Android 还是尽量每天做更新和维护Kotlin和Java一样支持多构造函数的姿势,并且对属性对get/set方法进行了二次封装这一篇,也通过简单的demo来讲一下相关知识构造函数在说Kotlin构造函数之前先提一提Java的构造函数和实例方 阅读详情

Kotlin语言中文站

在Kotlin中所有类都有一个共同的父类Any,这对于没有父类声明的类是默认父类。这跟Java是类似的,只不过在Java中默认父类是Object。

这里我们看看Any类源码:

public open class Any {
    /**
     * Indicates whether some other object is "equal to" this one. Implementations must fulfil the following
     * requirements:
     *
     * * Reflexive: for any non-null value `x`, `x.equals(x)` should return true.
     * * Symmetric: for any non-null values `x` and `y`, `x.equals(y)` should return true if and only if `y.equals(x)` returns true.
     * * Transitive:  for any non-null values `x`, `y`, and `z`, if `x.equals(y)` returns true and `y.equals(z)` returns true, then `x.equals(z)` should return true.
     * * Consistent:  for any non-null values `x` and `y`, multiple invocations of `x.equals(y)` consistently return true or consistently return false, provided no information used in `equals` comparisons on the objects is modified.
     * * Never equal to null: for any non-null value `x`, `x.equals(null)` should return false.
     *
     * Read more about [equality](https://kotlinlang.org/docs/reference/equality.html) in Kotlin.
     */
    public open operator fun equals(other: Any?): Boolean

    /**
     * Returns a hash code value for the object.  The general contract of `hashCode` is:
     *
     * * Whenever it is invoked on the same object more than once, the `hashCode` method must consistently return the same integer, provided no information used in `equals` comparisons on the object is modified.
     * * If two objects are equal according to the `equals()` method, then calling the `hashCode` method on each of the two objects must produce the same integer result.
     */
    public open fun hashCode(): Int

    /**
     * Returns a string representation of the object.
     */
    public open fun toString(): String
}

由上可知,也就为所有kotlin类都定义了这些方法。

Kotlin类默认是最终(final)的:不能被继承。如果需要被继承,请用关键字open:

class Shape() //不可被继承(默认)

open class Shape() //可被继承

如需继承父类,请在类头中把父类放到冒号之后:

open class Circle: Shape()

如果子类有一个主构造函数,其父类必须用子类主构造函数的参数“就地”初始化,有点抽象,看代码就明白了:

//父类
open class Shape(name:String){}

//子类, “就地”初始化
open class Circle(name:String): Shape(name){}

如果子类没有主构造函数呢?那就用带参数的次构造函数,父类总得初始化吧:

open class Circle: Shape {
   constructor(name: String) : super(name) {
   }

   //委托给上面的构造函数
   constructor(name: String, color: String) : this(name) {
   }  
}

如上,每个次构造函数必须用关键字super初始化父类,或委托给另外一个构造函数做到这一点。 当然,不同的次构造函数具体委托父类哪个构造方法,就看我们自己决定了:

open class Shape(name:String) {
   constructor(name:String, color: String) : this(name) {
   } 
}

//子类
open class Circle: Shape {
    constructor(name: String) : super(name) {
    }

    //这里我也可以委托父类主构造函数 super(name),但是这样color参数就没意义了
    constructor(name: String, color: String) : super(name, color) {
    }
}

覆盖方法

一个方法如果想被子类覆盖,仍然需要使用关键字open:

open class Shape(name:String) {
    constructor(name:String, color: String) : this(name) {

    }
    //可被子类覆盖
    open fun name() {
        print("fun##name.")
    }
    //子类不可覆盖
    fun draw(){}
}


//子类
open class Circle: Shape {
    ...
    
    override fun name() {
        super.name()
    } 
    ...
}

如上,name()函数被覆盖,同时它也可以继续被Circle的子类覆盖(相当于加了open)。如果想禁止被子类覆盖,可以使用final关键字。

...
final override fun name() {
     super.name()
}
...

覆盖属性

属性覆盖跟方法覆盖类似,均需要使用open关键字修饰。

open class Shape(name:String) {
    //属性
    open val tempAttribute : String = ""

    constructor(name:String, color: String) : this(name) {

    }
    
    open fun name() {
        print("fun##name.")
    }

    fun draw(){}
}



//子类
open class Circle: Shape {
    //覆盖属性
    override val tempAttribute: String = "Circle"
    
    constructor(name: String) : super(name) {

    }

    //我也可以委托父类主构造函数 super(name), 和上面的函数一样
    constructor(name: String, color: String) : super(name, color) {

    }

    final override fun name() {
        super.name()

    }
}


//子类覆盖属性还有种简单的写法,直接在主构造函数进行覆盖
open class Circle(name:String, override val tempAttribute: String): Shape(name) {
    final override fun name() {
        super.name()
    }
}

这里需要备注说明一下,我们可以使用var属性覆盖一个val属性,但反之不行。 你如果强行这么做,IDE也不允许,直接报错:


调用父类的方法

子类调用父类的函数或者属性访问器的实现可以使用super关键字:

open class Circle(name:String): Shape(name) {
    val childTempAttr: String = super.tempAttribute

    override fun name() {
        super.name()
    }
}

有两种使用场景需要注意下:

  • 场景一: 在内部类访问外部类的父类成员方法,可以通过由外部类名限定的super关键字来实现:
open class Circle(name:String): Shape(name) {

    val childTempAttr: String = super.tempAttribute

    override fun name() {
        super.name()
    }

    //内部类
    inner class Ball {
        fun draw() {
            //直接调用外部类的方法
            name()

            //调用外部类父类的方法
            super@Circle.name();
        }
    }
}

挺怪异的写法,我们把代码转成Java看看:

...
public final class Ball {
  public final void draw() {
     Circle.this.name();
     Circle.super.name();
  }
}
...

是不是有种“拨开云雾见天日”的感觉…

  • 场景二: 一个类继承了一个类同时实现了一个接口,并且两个父类都有相同的方法,子类如何调用父类的这个方法,如何区分呢?
//父类1
open class Rectangle {
    open fun draw() {
    }
}

//父类2
interface Polygon {
    fun draw(){
    }
}

//子类
class Square : Rectangle(), Polygon {
    override fun draw() {
        //调用Rectangle
        super<Rectangle>.draw()
        
        //调用Polygon
        super<Polygon>.draw()
		
		//子类也可以不调用父类,自己实现自己的逻辑
		/** todo */
    }
}

子类初始化顺序

如下代码,打印的结果是啥?

//父类
open class Shape(name:String) {

    open val tempAttribute : String = "Shape##tempAttribute".also { println(it) }

    init {
        println("Shape##init.")
    }

    constructor(name:String, color: String) : this(name) {
        println("Shape##constructor")
    }
}

//子类
class Square : Shape {

    override val tempAttribute: String = "Square##tempAttribute".also { println(it) }

    init {
        println("Square##init")
    }

    constructor(name: String, color: String) : super(name, color) {
        println("Square##constructor")
    }
}

//执行
fun main(args: Array<String>) {
    Square("正方形","红色")
}

//打印结果
Shape##tempAttribute
Shape##init.
Shape##constructor

Square##tempAttribute
Square##init
Square##constructor

所以父类的初始化是最先执行的,接着才是子类的初始化,跟Java别无二致。


上一篇:Kotlin学习历程——类的定义。
下一篇:Kotlin学习历程——接口

2025年北京市职工职业技能大赛第六届信息通信行业网络安全技能大赛复赛CTF部分WP-哥斯拉流量分析 题目没有任何提示,附件gzl.pcap解题哥斯拉流量300多KB包很多,没啥经验只能挨个看回来之后又狠狠得撸了一把哥斯拉流量分析我这里用的是哥斯拉4.0.1测试链接这里发了两个包,我们进行分析。 阅读详情

相关推荐

Halcon实战:5分钟搞定金属表面划痕检测(附完整代码解析)

本文提供了一份基于Halcon的金属表面划痕检测实战指南。通过核心的动态阈值算法,快速从图像中提取局部对比度异常区域,并结合形态学后处理与特征筛选,精准识别划痕。文章详解了从代码搭建、参数优化到工业场景适配的全流程,帮助工程师在五分钟内构建稳定高效的机器视觉检测方案。

weixin_29084231的博客 496

kotlin data class 遇到的问题以及解决方案

kotlin data class 遇到的问题以及解决方案

RELY_ON_YOURSELF的博客 5811

ASReview:基于主动学习的AI文献筛选工具,提升科研效率

主动学习是机器学习的一个重要分支,其核心原理是让算法能够主动选择最有价值的数据进行标注,从而以更低的成本获得更好的模型性能。这一技术通过人机协作的闭环流程,显著提升了数据标注和模型训练的效率和精度。在工程实践中,主动学习尤其适用于数据标注成本高昂或数据类别不平衡的场景,例如医学影像分析、自然语言处理中的文本分类以及推荐系统的冷启动问题。通过优先标注模型最不确定的样本,它能够有效解决传统机器学习面临的冷启动和数据稀疏性挑战。本文聚焦的ASReview项目,正是将主动学习原理应用于系统文献综述这一具体场景,通过

weixin_28725959的博客 432

【Kotlin -- 知识点】继承类

众所周知,Kotlin 是一门面向对象的开发语言。也有着面向对象语言的特性。而面向对象的三大特性即封装、继承、多态。

Kevin Learn Android 1011

WSL子系统启动报错 Wsl/Service/CreateInstance/CreateVm/HCS_E_SERVICE_NOT_AVAILABLE

WSL子系统启动报错 :Wsl/Service/CreateInstance/CreateVm/HCS_E_SERVICE_NOT_AVAILABLE 于是分析原因,最终发现是Windows功能中的虚拟机平台功能不知道什么时候被取消了。

Linux I Tell U 6万+

深度学习 load_data_fashion_mnist

pytorch 中报错:PermissionError: [WinError 5] 拒绝访问。: '…/data’ 在学习李沐大神动手学习深度学习卷积神经网络章节中,调用d2l包中load_data_fashion_mnist报错,这可能是***权限***的问题。 batch_size = 256 train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size,batch_size) 我的解决方法是 重新定义一下 load_data_fashi

纸上得来终觉浅,绝知此事要躬行 9148

Kotlin学习笔记(五)——继承、单例类等各种类的使用

Kotlin的open继承,内部类,嵌套类,数据类,密封类,Any超类,枚举类,运算符重载,伴生对象(静态),object单例,强制与智能类型转换,copy函数

mm731296278的博客 1558

Unity Sprite Atlas C++底层原理全解析 —— “像素聚合工厂”的秘密

Unity Sprite Atlas C++底层实现简析 Sprite Atlas是Unity中用于优化2D渲染性能的核心机制,其C++底层实现如同一个高效的"像素聚合工厂"。该系统通过将多个小纹理合并为一个大纹理,显著减少Draw Call次数和GPU纹理切换开销。 在数据结构上,底层采用SpriteAtlasData存储图集元数据,PackedTexture管理合并后的大纹理,SpriteFrame记录每个子精灵的位置信息,并通过哈希表实现快速查找。编辑器阶段使用最大矩形等算法优化空

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 204

【java学习】object中的equals方法

在java.lang.Object类中可以看到对equals方法的说明 /** * Indicates whether some other object is “equal to” this one. * * The {@code equals} method implements an equivalence relation * on non-null object references: * * It is reflexive: for any non-null reference value

VICI的博客 427

Kong API Gateway 配置与深入

Kong是一个开源的、高性能的API网关,提供了一种简单易用的服务间路由、流量管理和安全防护方案,其最初起源于Nginx Inc.,但后迁移至Apache Software Foundation。Kong支持RESTful、GraphQL、TCP/UDP等协议,可与AWS Lambda、Azure Functions、Google Cloud Functions等云函数平台集成。其主要功能包括:服务发现与负载均衡、请求代理、身份认证与授权、缓存、日志记录、监控指标、灰度发布、多种插件等。

AI天才研究院 2284

【Claude】Invalid API key 无效密钥报错已解决

API 拒绝了你提供的 key。最高频的根因是老的/被撤销的 key 藏在某处自动加载的配置文件里,而你对此不知情。→ 检查所有可能注入 key 的来源(.env.envrc、shell 配置、IDE 设置、)→ 清除无效来源 → 用/status验证。参考:Claude Code 官方《错误参考》"身份验证"章节、社区 Invalid API key 排查记录。

博客 7923

Kotlin的data class

在 Kotlin 中,data class是一种专门用来存储数据的类。与普通类相比,data class提供了简化数据存储的语法,并且自动生成了一些常用的方法,例如toString()equals()hashCode()和copy()。

liulanba的博客 1941

电子图像增稳(EIS)原理详解——从抖动补偿到代码实现

电子图像增稳(EIS)是一种通过软件算法实现视频稳定的技术,广泛应用于GoPro、手机和无人机等设备。与光学防抖(OIS)和机械云台不同,EIS通过图像裁切和运动补偿来消除抖动,具有成本低、补偿范围大的优点,但会损失10-30%的画幅。其核心流程包括运动检测、抖动分离、运动补偿和图像裁切四个步骤。相比硬件方案,纯软件实现的EIS更适合消费级电子产品,已成为移动设备视频拍摄的重要技术。

电脑管家 410

分享下学习Kotlin的历程-访问作用域/类修饰词/继承

转载请注明出处:王亟亟的大牛之路开篇之前还是老规矩,先安利https://github.com/ddwhan0123/Useful-Open-Source-Android 还是尽量每天做更新和维护java中访问作用域与继承等姿势很好的对我们的代码进行了封装,那么Kotlin中又是如何定义的呢?这一篇,通过一个简单的demo来讲一下相关知识访问作用域访问作用域也叫访问权限修饰符 通过修饰符来控制类

王亟亟的博客 2729

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Kotlin学习历程——抽象类与接口

Kotlin语言中文站 Kotlin接口可以即包含抽象方法的声明也包含实现。与抽象类不同的是,接口无法保存状态。它可以有属性但必须声明为抽象或提供访问器实现。 定义接口 使用关键字interface来定义一个接口: interface A { //有函数体的函数 fun foo() { println("A##foo") } //待实现的函数 fun bar() } 实现接口 一个类可以实现一个或者多个接口。 class C : A { .

hepingdev的专栏 1612

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Kotlin学习历程——泛型

Kotlin语言中文站 简单回顾Java泛型 泛型是什么 Java在JDK5中引入了泛型机制。 它的意思可以理解为把具体的类型 参数化,编码时用符号代替类型,实际使用的时候再传入确定的类型,可以用在类、接口或者方法上面。 那么泛型的作用是什么呢?先看一段代码。 public final class Main { public static void main(String[] args) { /** * 案例场景 * * 同事.

hepingdev的专栏 2357

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Kotlin学习历程——扩展

Kotlin语言中文站 kotlin能够扩展一个类的新功能而无需继承该类,这种方式叫做扩展。例如:你可以为一个你不能修改的,来自第三方库中的类编写一个新的函数,这个新增的函数就像那个原始类本来就有的函数一样。 定义扩展函数 声明一个扩展函数,我们需要用一个接收者类型也就是被扩展的类型来作为他的前缀。 /** 在Extension.kt文件中定义扩展函数 */ fun <T> MutableList<T>.swap(index1: Int, index2: Int) { .

hepingdev的专栏 2278

Kotlin学习基础知识大全(上)

Kotlin是由JetBrains公司开发的一种静态类型编程语言,最初发布于2011年。JetBrains是知名IDE工具IntelliJ IDEA的开发商,他们开发Kotlin的目的是为了解决Java语言在开发效率、代码简洁性和安全性方面的一些不足。2016年2月,Kotlin 1.0正式发布,标志着语言进入稳定阶段。2017年5月,在Google I/O大会上,Google宣布Kotlin成为Android开发的官方支持语言,这一决定极大地推动了Kotlin的普及。Kotlin中使用fun。

百锦再的博客 1万+

Kotlin零基础入门到精通(精选)

Kotlin从入门到精通一. Kotlin课程概述1.1 课程安排:1.2 什么是Kotlin?1.3 Kotlin的发展历程1.4 学习目标1.5 必备知识1.6 参考资料1.7 Hello,world二. 数据类型2.1 本章目标2.2 Boolean类型2.3 Number类型2.4 Char类型2.5 类与对象2.6 空类型和智能类型转换2.7 包2.8 区间2.9 数组三. 程序结构3.1 常量与变量3.2 函数3.3 Lambda表达式 一. Kotlin课程概述 1.1 课程安排: 课程介绍

暗余的博客 2万+

kotlin学习和常用知识

Kotlin 是一种由 JetBrains 公司开发的静态类型编程语言,旨在为 Java 开发者提供一种更加安全、简洁、易于使用的编程语言。Kotlin 可以编译成 Java 字节码,因此可以在 Java 虚拟机(JVM)上运行。下面是关于 Kotlin 的详细解释、发展历史、语法学习和代码解读。

AI时代光年 1506

Android学习笔记-Kotlin基础语法

一、Kotlin的发展历程 2011年,JetBrains发布了Kotlin的第一个版本,并在2012年将其开源。 2016年Kotlin发布了1.0正式版,代表着Kotlin语言已经足够成熟和稳定了,并且JetBrains也在自家的旗舰IDE开发工具IntelliJ IDEA中加入了Kotlin的支持。 2017年Google宣布Kotlin正式成为Android开发一级语言,并且Android Studio也加入了对Kotlin的支持。 2019年Google正式宣布了Kotlin First,未来提供

u010186280的博客 628

Kotlin学习历程五:kotlin中的类的使用

一、类的声明 关键字 声明类的关键字为class 声明格式 class Test{ // 属性... ... // 构造函数 ... // 函数 ... // 内部类 ... ... } 当类没有结构体的时候,大括号可以省略。即: class Test   二、类的构造函数 在Kotlin中,允许有一个主构...

LeeKumaの技术Note 682

Kotlin笔记35——定义接口

Kotlin定义接口 举例简单声明一个接口: interface IView { fun show() fun hide() } 实现上面的接口: class Demo9 : IView { override fun show() = println("视图显示了") override fun hide() =println("视图隐藏了") } fun ...

裕博的博客 586

[技术分享]-是时候关注Kotlin了

编程界小小白一枚,平时刷刷知乎看看博客,偶发性遇见GitChat这个文:https://mp.weixin.qq.com/s/K6NTWV9gth8Ge-eDvTzWfQ于是,顺带科普了一下自己[ 先上Kotlin语言中文版文档:https://www.gitbook.com/book/hltj/kotlin-reference-chinese/details ]Kotlin的来历Kotlin的作...

qiaoqiao0609的博客 317

三篇文章带你快速入门 Kotlin(上)

文章目录 第一讲 快速入门kotlin(上)Kotlin的发展历程Kotlin相比于Java的优势Kotlin的工作原理函数和变量变量内嵌表达式函数逻辑控制if条件语句when条件语句for-in循环语句控制循环语句Break控制循环语句Continue面向对象编程类与对象继承构造器接口数据类单例类集合集合的创建集合的取值Lambda编程集合的函数式APIJava函数式API空指针检查可空类型系统判空辅助工具函数默认值 第一讲 快速入门kotlin(上) Kotlin的发展历程 2011年,JetBrai

yaoxin521123的博客 838

Kotlin - 协程基础及原理,4年小Android的心路历程

协程上下文在协程中的作用非常大,有它在相当于协程有了装备卡槽一样。你可以将你想添加的上下文对象合并到参数上,然后在其他地方使用。的数据结构有如下特点:可以通过[]以类似List的方式访问任何一个协程上下文对象,[]内是目标协程上下文。协程上下文可以通过的方式依次累加,当然+=也是可用的。我们来自定义一个协程上下文给协程添加一个名字:应用到示例中:suspend {.name}”)})自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

2401_84149213的博客 1338
上一篇: Kotlin学习历程——类的定义
下一篇: Kotlin学习历程——抽象类与接口
hepingdev
博客等级 码龄5年 3581粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hepingdev

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值