Kotlin-简约之美-基础篇(四):类与继承
文章目录
- 类的创建
- 主构造方法
- 次构造方法
- 继承
- 成员方法重写
- 成员变量重写
- 调用父类方法和变量
- 学习交流
类的创建
与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-简约之美-基础篇(四):类与继承相关推荐
- Kotlin快速入门:基础语法、类与继承、集合
参考书籍: <AtomicKotlin>,全英文,读起来慢,但是写得很详细,没有任何语言基础的也能看懂 <第一行代码 Android 第三版>,第二章,有java基础的看一看就 ...
- 【Kotlin】学习小记-基础篇
Kotlin学习小记-基础篇 Kotlin的介绍 入门基础篇 属性声明 关于val和final的小Tips 参数 1.可变参数 2.命名参数 函数返回值 1.默认返回Unit值 2.返回Nothing ...
- java程序试岗内容_java程序员修炼之路基础篇四:继承
上一篇文章我跟大家聊了一下"封装",今天我们聊一下同样作为java语言三大特征之一的"继承". 简单说"继承"就是从一个已知类派生出新类的过 ...
- Java基础篇:封装、继承、多态三大特性
目录: 一.Java三大特性之:封装 二.Java三大特性之:继承 三.Java三大特性之:多态 一.Java三大特性之:封装 1.什么是封装: 封装,就是将数据和基于数据的操作封装在一起,数据被保护 ...
- python3 入门 (四) 类与继承
Python 类 Python中的类提供了面向对象编程的所有基本功能:类的继承机制允许多个基类,派生类可以覆盖基类中的任何方法,方法中可以调用基类中的同名方法. 对象可以包含任意数量和类型的数据. p ...
- Java语言程序设计(基础篇) 第十一章 继承和多态
第十一章 继承和多态 11.1 引言 面向对象的编程允许你从已经存在的类中定义新的类,这称为继承. 11.2 父类和子类 1.继承使得你可以定义一个通用的类(既父类),之后扩充该类为一个更加特定的类( ...
- C#基础8:类的继承
PS:注释和讲解全在代码中 1. 类的继承 C#继承特点 C#派生类只能继承一个父类,可以通过接口来实现多重继承 继承是可以传递的,例如C从B派生,B又从A派生,那么C不仅继承了B中声明的成员,同样也 ...
- Python基础语法12 类的继承
继承: 面向对象的第二大特征: 继承:如果两个或者两个以上的类具有共同的属性以及方法,我们可以将共同的部分抽取 出来,在抽取的类中声明公共的部分. 被抽取出来的类–父类,超类,基类 其他类-- 子类, ...
- Kotlin-简约之美-基础篇(五):data类和enum类
文章目录 data类 enum类 学习交流 data类 在Java中,我们在信息类创建信息类时总是伴随大量getter/setter方法,虽然可以用工具自动生成,但也影响美观.Kotlin中使用dat ...
最新文章
- sqlite学习笔记7:C语言中使用sqlite之打开数据库
- git已有项目修改提交
- 从性能角度选购Adroid智能手机,双核、大屏与游戏的取舍
- Boost:形成const&到_1的测试程序
- CVE-2015-1635(MS15-034)-HTTP.sys远程代码执行复现
- 【算法】数组与矩阵问题——找到无序数组中最小的k个数
- linux .net core 后台执行,.NET Core基于Generic Host实现后台任务方法教程
- 在sealos搭建的k8s集群中自定义kubeconfig文件
- 【负载观测】永磁同步电机的负载观测及前馈补偿
- python np数组中括号里面‘:n‘与‘n:‘什么意思
- 字符串初始化_触发类初始化的几个面试坑
- iOS 版本更新迭代
- 图书管理系统数据库设计
- redis雪崩击穿穿透
- win7声音图标不见,此图标当前处于未活动状态
- MOS开关管额定电流的选择
- 荧光量子产率计算机模拟,如何提高荧光染料的量子产率,或许可以从这里找到答案...
- 精密型工业级UHF超高频RFID读写器|读卡器JT7300的MODBUS协议说明
- 儿童交通安全教育宣传手抄报模板
- GPG对称加密与非对称加密
热门文章
- ble4.2扫描回复包详解(SCAN_RSP)
- CSC艺术人才|讲师硕士AV签证英国访学成行
- 国内旅游社区网站推荐
- 能源消耗监测管理系统-用能监测系统
- 00后大学生:精美绝伦的微积分教科书
- vue项目登录页-实现字体动画案例
- 安装Visual Studio 2015时,出现JavaScript_ProjectSystem.msi和JavaScript_LanguageService.msi安装包丢失或损坏的情况
- altium Designer22 AD22 CAD电子绘图员三级知识点操作说明
- Linux系统常用命令及其使用详解大全
- win7删除不了打印机该怎么办?win7删除打印机后刷新又出来的解决方法