文章目录

  • 类的创建
    • 主构造方法
    • 次构造方法
  • 继承
    • 成员方法重写
    • 成员变量重写
    • 调用父类方法和变量
  • 学习交流

类的创建

与Java一样,Kotlin也是用class关键字声明类。

class User{}

Kotlin中一个类可以有一个主构造方法(primary constructor)和一个或多个次构造方法( secondary constructors)。

主构造方法

主构造方法通过在类名后面添加constructor和参数实现:

class User{}

如果没有注解和可见的修饰符,constructor关键字可以省略:

class User private constructor(name: String) {}
  • 初始化顺序
    类内部的init模块和变量的初始化顺序按照他们出现的顺序进行
fun main(args: Array<String>) {User("mao")
}class User(name: String) {val firstProperty = "First property".also(::println)init {println("First initializer")}val secondProperty = "Second property".also(::println)init {println("Second initializer")}
}

输出:

  • 成员变量和init模块在初始化时可直接使用主构造方法中的参数
First property
First initializer
Second property
Second initializer
次构造方法
  • 次构造方法也使用constructor实现
class User {var name: String = ""constructor(name: String) {this.name = name}
}
  • 当类声明了主构造方法,所有次构造方法必须直接或间接调用主构造方法
class User() {constructor(name: String) : this() {print("conconstructor")}constructor(name: String, age: Int) : this(name) {}
}

类中的变量初始化和init模块初始化都是主构造方法的一部分,所以都在次构造方法之前执行

fun main(args: Array<String>) {User("mao")
}class User() {constructor(name: String) : this() {print("conconstructor")}var name = "property".also(::println)init{println("init")}
}

输出:

property
init
conconstructor
  • 当一个类没有任何构造方法时,默认生成一个public类型的无参主构造方法,如果不希望这个默认构造方法存在,可以主动声明一个主构造方法
class User private constructor() {}

继承

Kotlin中的类默认是final类型的,想要被继承,得用“open”关键字修饰。

open class Shape {}class Rectangle : Shape {}

子类的所有构造构造方法必须直接或间接调用一个父类的构造方法

open class Shape {constructor(name: String) {print(name)}
}class Rectangle : Shape {constructor(name: String) : super(name) {}constructor(name: String, age: Int) : this(name) {}
}
成员方法重写

继承过程中,只有open修饰的方法才能被重写,重写时要用override修饰。
open特性也能被继承,想要断了open特性,只需用final修饰即可。

open class Shape {open fun method() {}
}open class Rectangle : Shape() {override fun method() {}
}class Square : Rectangle() {final override fun method() {}
}
成员变量重写

与方法重写相同,只有open修饰的变量才能被重写,open同样可以继承,也可以用final中断。
重写过程中,变量可由val类型变为var类型,反之则不行。

open class Shape {open val name: String = "Shape"
}open class Rectangle : Shape() {override var name: String = "Rectangle"
}class Square : Rectangle() {final override var name = "Square"
}
调用父类方法和变量
  • 可通过“super”关键字调用父类的方法和成员变量
open class Shape {open val name: String = "Shape"open fun draw() {}
}open class Rectangle : Shape() {override var name: String = super.nameoverride fun draw() {super.draw()}
}
  • 内部类调用外部类父类的方法
    使用“super@Outer”方式:
open class Sup {open fun method() { println("Sup.method") }
}class Sub:Sup(){inner class Inner{fun test(){super@Sub.method()}}
}
  • 当继承的类和接口当中出现相同的方法(方法名和参数都相同),通过类似泛型的方法明确调用哪个方法
interface Action {fun eat() {println("Action")}
}open class Animal {open fun eat() {println("Animal")}
}class Human() : Animal(), Action {override fun eat() {super<Action>.eat()super<Animal>.eat()}
}

学习交流

欢迎入群交流学习,Android、Java开发技术交流群

  • QQ群:810970432
  • email:geduo_83@163.com

Kotlin-简约之美-基础篇(四):类与继承相关推荐

  1. Kotlin快速入门:基础语法、类与继承、集合

    参考书籍: <AtomicKotlin>,全英文,读起来慢,但是写得很详细,没有任何语言基础的也能看懂 <第一行代码 Android 第三版>,第二章,有java基础的看一看就 ...

  2. 【Kotlin】学习小记-基础篇

    Kotlin学习小记-基础篇 Kotlin的介绍 入门基础篇 属性声明 关于val和final的小Tips 参数 1.可变参数 2.命名参数 函数返回值 1.默认返回Unit值 2.返回Nothing ...

  3. java程序试岗内容_java程序员修炼之路基础篇四:继承

    上一篇文章我跟大家聊了一下"封装",今天我们聊一下同样作为java语言三大特征之一的"继承". 简单说"继承"就是从一个已知类派生出新类的过 ...

  4. Java基础篇:封装、继承、多态三大特性

    目录: 一.Java三大特性之:封装 二.Java三大特性之:继承 三.Java三大特性之:多态 一.Java三大特性之:封装 1.什么是封装: 封装,就是将数据和基于数据的操作封装在一起,数据被保护 ...

  5. python3 入门 (四) 类与继承

    Python 类 Python中的类提供了面向对象编程的所有基本功能:类的继承机制允许多个基类,派生类可以覆盖基类中的任何方法,方法中可以调用基类中的同名方法. 对象可以包含任意数量和类型的数据. p ...

  6. Java语言程序设计(基础篇) 第十一章 继承和多态

    第十一章 继承和多态 11.1 引言 面向对象的编程允许你从已经存在的类中定义新的类,这称为继承. 11.2 父类和子类 1.继承使得你可以定义一个通用的类(既父类),之后扩充该类为一个更加特定的类( ...

  7. C#基础8:类的继承

    PS:注释和讲解全在代码中 1. 类的继承 C#继承特点 C#派生类只能继承一个父类,可以通过接口来实现多重继承 继承是可以传递的,例如C从B派生,B又从A派生,那么C不仅继承了B中声明的成员,同样也 ...

  8. Python基础语法12 类的继承

    继承: 面向对象的第二大特征: 继承:如果两个或者两个以上的类具有共同的属性以及方法,我们可以将共同的部分抽取 出来,在抽取的类中声明公共的部分. 被抽取出来的类–父类,超类,基类 其他类-- 子类, ...

  9. Kotlin-简约之美-基础篇(五):data类和enum类

    文章目录 data类 enum类 学习交流 data类 在Java中,我们在信息类创建信息类时总是伴随大量getter/setter方法,虽然可以用工具自动生成,但也影响美观.Kotlin中使用dat ...

最新文章

  1. nginx 只写了listen80 没有 listen443 用https访问
  2. 学习lulu之——tips 提示
  3. php打印模板插件,smarty的插件功能是smarty模板的精华
  4. 生成awr报告时报ORA-06502: PL/SQL: 数字或值错误 : 字符串缓冲区太小
  5. leetcode 合并数组
  6. C语言:计算1!+2!+3!+...+100!
  7. 5个相见恨晚的Linux命令
  8. 聊聊spring data jpa的JpaQueryLookupStrategy
  9. 向视图中插入的数据能进入到基本表中去吗?_数据库调优,调的是什么及常见手法...
  10. xml中的if和截取字符串
  11. 2021年焊工作业压力焊考试题库
  12. 在Android studio中出现 ‘opencv2/opencv.hpp‘ file not found
  13. 《网络基础》p84.interface gigabitethernet 0/0/0报错
  14. UVA1391/LA3713 Astronauts
  15. python模型保存与恢复_tensorflow1.0学习之模型的保存与恢复(Saver)_python
  16. linux查看磁盘naa,linux查看计算机硬件信息
  17. 编译内核报错 No rule to make target ‘debian/canonical-certs.pem‘ 或 ‘canonical-revoked-certs.pem‘ 的解决方法
  18. EDG 赢了,程序员们坐不住了.....
  19. Linux 禁止查看根目录,Linux用户登录之后,不能查看根目录列表(转载+原创)
  20. 【原生js实现MVVM核心框架】

热门文章

  1. Windows 7系统里释放带宽限制
  2. 视频加水印有哪些好处?录制视频如何加水印
  3. oracle安装报错:orcl:orcl
  4. 华为云计算之FusionCompute8.0版本安装
  5. php trip_tags,PHP之字符串函数
  6. springboot微信sdk方式进行微信支付
  7. binrui -圆周率找日期/日历
  8. aspose-word for java word转pdf 解决遇到的问题
  9. 为支持全美达对抗Intel AMD豪爽掏出7500万美元
  10. 江南爱软装十大品牌 房间想要舒适清新,选择蓝色系窗帘就可以