文章目录

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

类的创建

与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. sqlite学习笔记7:C语言中使用sqlite之打开数据库
  2. git已有项目修改提交
  3. 从性能角度选购Adroid智能手机,双核、大屏与游戏的取舍
  4. Boost:形成const&到_1的测试程序
  5. CVE-2015-1635(MS15-034)-HTTP.sys远程代码执行复现
  6. 【算法】数组与矩阵问题——找到无序数组中最小的k个数
  7. linux .net core 后台执行,.NET Core基于Generic Host实现后台任务方法教程
  8. 在sealos搭建的k8s集群中自定义kubeconfig文件
  9. 【负载观测】永磁同步电机的负载观测及前馈补偿
  10. python np数组中括号里面‘:n‘与‘n:‘什么意思
  11. 字符串初始化_触发类初始化的几个面试坑
  12. iOS 版本更新迭代
  13. 图书管理系统数据库设计
  14. redis雪崩击穿穿透
  15. win7声音图标不见,此图标当前处于未活动状态
  16. MOS开关管额定电流的选择
  17. 荧光量子产率计算机模拟,如何提高荧光染料的量子产率,或许可以从这里找到答案...
  18. 精密型工业级UHF超高频RFID读写器|读卡器JT7300的MODBUS协议说明
  19. 儿童交通安全教育宣传手抄报模板
  20. GPG对称加密与非对称加密

热门文章

  1. ble4.2扫描回复包详解(SCAN_RSP)
  2. CSC艺术人才|讲师硕士AV签证英国访学成行
  3. 国内旅游社区网站推荐
  4. 能源消耗监测管理系统-用能监测系统
  5. 00后大学生:精美绝伦的微积分教科书
  6. vue项目登录页-实现字体动画案例
  7. 安装Visual Studio 2015时,出现JavaScript_ProjectSystem.msi和JavaScript_LanguageService.msi安装包丢失或损坏的情况
  8. altium Designer22 AD22 CAD电子绘图员三级知识点操作说明
  9. Linux系统常用命令及其使用详解大全
  10. win7删除不了打印机该怎么办?win7删除打印机后刷新又出来的解决方法