文章目录

  • I . 属性覆盖基本方式
  • II . 属性覆盖的四种情况
  • III . 常量 ( val ) / 变量 ( var ) 属性覆盖
  • IV . 子类初始化时考虑覆盖属性的使用

I . 属性覆盖基本方式


1 . 属性覆盖 : 属性覆盖与方法覆盖的方式基本相同 ;

① 属性覆盖前提 : 在父类中使用 open 修饰的属性 , 可以在子类中被覆盖 ;

② 属性覆盖方式 : 在子类中使用 override 修饰被覆盖的属性 ;

2 . 属性覆盖示例 :

open class Father {//被覆盖的属性需要使用 open 修饰open var age : Int = 60
}class Son : Father() {//子类覆盖的属性需要使用 override 修饰override var age : Int = 28
}

II . 属性覆盖的四种情况


1 . 子类的覆盖属性的要求 : 子类中覆盖的属性有特定的要求 , 不能是延迟加载属性 , 下面列举几种常见的方式 ;

2 . 覆盖属性初始化 : 子类中使用 override 覆盖的属性需要设定一个初始值 ;

open class Father {open var age : Int = 60
}class Son : Father() {override var age : Int = 18
}

3 . 覆盖属性设置 getter / setter 方法 : 子类中使用 override 覆盖的属性设置对应的 getter 和 setter 方法 ;

open class Father {open var age : Int = 60
}class Son : Father() {override var age : Intget() {TODO()}set(value) {}
}

4 . 将子类和覆盖属性声明成抽象化的 : 子类可以声明成抽象类 , 其 override 属性也可以声明成抽象属性 ;

open class Father {open var age : Int = 60
}abstract class Son : Father() {abstract override var age : Int
}

5 . 覆盖属性声明在子类主构造函数中 : 可以将子类中覆盖的父类属性声明在主构造函数中 , 如下示例 :

open class Father {open var age : Int = 60
}class Son(override var age: Int) : Father() {}

III . 常量 ( val ) / 变量 ( var ) 属性覆盖


1 . 常量覆盖 : 父类中 val 修饰的常量属性可以在子类中使用 val 或 var 覆盖 ;

open class Father {open val name : String = "Tom"open val age : Int = 60
}class Son : Father() {//1 . 父类常量常规情况下被子类重写成常量override val name : String = "Jerry"//2 . 父类常量可以被子类重写成变量override var age : Int = 18
}

2 . 变量覆盖 : 父类中的 var 属性可以被子类中的 var 属性覆盖 , 不能被 val 属性覆盖 ;

① 代码示例 ( 正确 ) :

open class Father {open var age : Int = 60
}class Son : Father() {//父类变量 只能 被子类重写成变量 , 不能被重写成常量override var age : Int = 18
}

② 错误示例 ( 错误 ) :

3 . 覆盖原理 :

① 常量覆盖 : 常量属性只有 get 方法 , 没有 set 方法 ; 子类将常量 override 成变量 , 就是为其多写了一个 set 方法 ;

② 变量覆盖 : 但是子类不能讲一个变量重写成常量 , 父类的方法可以修改添加 , 但是不能删除 ;

IV . 子类初始化时考虑覆盖属性的使用


1 . 子类初始化 : 子类初始化时 , 要先将父类进行初始化 , 然后开始初始化子类 ;

2 . 父类初始化流程 :

① 父类构造函数 : 先调用主构造函数 / 次构造函数 ;

② 父类初始化 : 然后调用父类属性构造器 和 init 初始化代码块 , 这两个模块优先级相同 , 根据其代码顺序从上到下执行 ;

3 . 子类初始化流程 : 执行完父类初始化后 , 开始执行子类初始化 ;

① 子类构造函数 : 执行子类构造函数剩余部分 ( 如果有的话 , 一般是次构造函数 ) ;

② 子类初始化 : 执行子类属性构造器 和 init 初始化代码块 代码 , 这两个模块优先级相同 , 根据其代码顺序从上到下执行 ;

4 . 初始化过程中的覆盖属性 : 这里加入对覆盖属性的考虑 , 父类初始化过程中 , 子类覆盖的属性还没有初始化 , 父类的 open 属性可能在子类初始化过程中被修改 ;

5 . 最佳实践 : 在父类中 , 尽量不在 构造函数 , init 初始化代码块 , 属性初始化 时使用被 open 关键字修饰的可覆盖属性成员 , 因为该值不稳定 , 会增加不确定因素 ;

【Kotlin】Kotlin 类的继承 二 ( 属性覆盖 | 属性覆盖的四种情况 | 常量 / 变量 属性覆盖 | 子类初始化与属性覆盖 )相关推荐

  1. java abc 979899_商品标题由关键词组成,关键词主要包括核心词、类目词、属性词以及长尾词四种类型。其中属性词是指...

    商品标题由关键词组成,关键词主要包括核心词.类目词.属性词以及长尾词四种类型.其中属性词是指 答:商品属性 网签备案具有创设权利的功能,能产生物权变动的效力. 答:错 下列程序执行后输出的结果是\nx ...

  2. 三、kotlin的类和对象(二)

    theme: channing-cyan 继承★ kotlin 沿用了 java 的单继承系统, 不允许 c++ 的多继承出现, 但允许 kotlin 接口的多实现 open class Base(v ...

  3. 定类,定序,定距,定比四种数据类型

    在这个世界上有无限多的数据,而每种数据都有属于自己的属性.那么做数据挖掘数据分析的时候,要对杂乱无章数据由一定的敏感度,学会分析数据属于哪一种类型也是一种技能.多留意身边的一些数据,试试给他分个类型也 ...

  4. 定类,定序,定距,定比四种数据类型 1

    在这个世界上有无限多的数据,而每种数据都有属于自己的属性.那么做数据挖掘数据分析的时候,要对杂乱无章数据由一定的敏感度,学会分析数据属于哪一种类型也是一种技能.多留意身边的一些数据,试试给他分个类型也 ...

  5. 属性赋初始值的四种写法--C#6.0新特性

    1 介绍 在C# 6.0 语法出来前,属性的赋初始值使用get:set:虽然已经相对于最原始的写法简洁了非常多,但是还不够,还不够,还不够...今天刚好一直在想着前几天朋友问我的有关属性赋初始值的问题 ...

  6. Spring boot锦集(二):整合邮件发送的四种方法 | 纯文本的邮件、带有图片的邮件、带Html的邮件、带附件的邮件(很详细)

    前言 邮件发送,听着很神秘,然而对于Spring Boot来说,这个功能已被集成好,只需引入spring-boot-starter-mail依赖后,少量代码即可实现大部分邮件发送需求. 本文以异常教程 ...

  7. python接口自动化(三十二)--Python发送邮件(常见四种邮件内容)番外篇——上(详解)...

    简介 本篇文章与前边没有多大关联,就是对前边有关发邮件的总结和梳理.在写脚本时,放到后台运行,想知道执行情况,会通过邮件.SMS(短信).飞信.微信等方式通知管理员,用的最多的是邮件.在linux下, ...

  8. python接口自动化(三十二)--Python发送邮件(常见四种邮件内容)番外篇——上

    简介 本篇文章与前边没有多大关联,就是对前边有关发邮件的总结和梳理.在写脚本时,放到后台运行,想知道执行情况,会通过邮件.SMS(短信).飞信.微信等方式通知管理员,用的最多的是邮件.在linux下, ...

  9. python 类装饰器和继承_python装饰器、继承、元类、mixin,四种給类动态添加类属性和方法的方式(一)...

    介绍装饰器.继承.元类.mixin,四种給类动态添加类属性和方法的方式 有时候需要給类添加额外的东西,有些东西很频繁,每个类都需要,如果不想反复的复制粘贴到每个类,可以动态添加. 1 #coding= ...

最新文章

  1. zeroc-ice的全双工通信策略
  2. Python_面向对象_类1
  3. 解决IDEA自动重置LanguageLevel和JavaCompiler版本的问题
  4. Mschat控件示例升级错误处理方法
  5. 不要一棍子打翻所有黑盒模型,其实可以让它们发挥作用
  6. 截图如何能截到鼠标?脑洞小方法
  7. boot lib分离 spring_SpringBoot打包分离依赖jar和资源文件
  8. java的调试页面_[Java教程]使用开发者工具调试jsp页面中的脚本
  9. bzoj1724[Usaco2006 Nov]Fence Repair 切割木板*
  10. JavaScript 学习计划
  11. LeetCode.83. Remove Duplicates from Sorted List(删除单链表中的重复元素)
  12. 实战Python:利用Python和PyQt5实现瑞幸咖啡点餐系统
  13. django复习笔记2:models
  14. hdu1059Dividing
  15. Spring Cloud 微服务
  16. 市面上大部分渗透工具下载
  17. treetable怎么带参数_jquery treeTable插件使用细则
  18. linux分区拓展容量,Linux系统分区容量扩充的方法
  19. Fly.js HTTP 请求解决方案
  20. [python爬虫]喜马拉雅音乐

热门文章

  1. SQL基础:常用SQL语句详解(转)
  2. 黑马lavarel教程---5、模型操作(AR模式)
  3. 04:网络层协议介绍
  4. Java常用工具类---IP工具类、File文件工具类
  5. 云-阿里云-清单:清单目录
  6. idea设置JVM运行参数
  7. CentOS7下安装ELK三件套
  8. Spark编程模型几大要素
  9. 想拿高新就必须知道的知识
  10. 进程间通信(一)管道