Kotlin-类和继承
来源:互联网 发布:网络魔兽世界 编辑:程序博客网 时间:2024/05/29 12:35
创建类
创建一个类很简单,使用class关键字就可以, 如下
class Person{}
构造方法
在Kotlin中,构造方法有两种“类型”,第一是主要构造方法,第二就是次要构造方法,
1. 主要构造方法直接就跟在类名后面,使用关键字”constructor”即可
class Person constructor(){}
当然,如果主要构造方法没有注解或一些修饰符,也可以省略关键字constructor,
class Person(){}
==注意==,这里的主要构造方法中,是不可以有任何代码的,不可以有代码?那我们要初始化怎么办?难道不可以初始化?肯定不是,不过初始化,则需要在init关键字中,如下
class Person(){ init{ println("Person init place"); }}
以上说的构造方法都是没有constructor关键字,那么是不是在任何情况下都不需要了?肯定不是的,看以下代码:
class Person pubilc @Inject constructor(){ //...}
- public,有修饰符
@Inject,注解
- 次要构造方法
要声明次要构造方法的时候,还是需要constructor关键字
- 次要构造方法
class Person{ constructor(parent:Person){ //... }}
如果类中有主要构造方法,那么次要构造方法中也是需要调用主要构造方法,可以直接或间接调用,在这时候,可以使用this关键字来调用。
class Person(name: String) { constructor(name: String, parent: Person) : this(name,11) { } constructor(name:String,age:Int):this(name){ }}
如果一个非抽象类中没有任何构造方法,那么Kotlin会自动生成一个无参的public构造方法,如果不使用默认构造方法,那么就必须要修改构造方法
创建类的实例
fun test(){ val p = Person("MK"); val p1 = Person("MK1",11); val pChild=Person("MK2",p) val app=App();}class Person(name: String) { constructor(name: String, parent: Person) : this(name, 11) {} constructor(name: String, age: Int) : this(name) {}}class App{}
类的成员
一个类可以包含以下内容:
- 构造方法和初始代码块
- 函数
- 属性
- 内部类
- 对象声明
继承
在 Kotlin中,所有类都是Any的子类,如果没有显示的继承一个类,默认都继承Any类,这和Java中的Object是一个道理,Any中同样也包含有三个函数:equals,hashCode,toString。如果我们要明显继承某个类,则可以像下面这样:
open class Parent(p:Int)class Children(p:Int):Parent(p)
如果父类有主要构造方法,那么子类一定要实现。在 Kotlin中,所有类默认是终结的,也就是不可继承的,open关键字标识,这个类是开放的,和Java的final关键字是相反的效果,
重写方法
在前面的继承中看到过,在Kotlin中,如果要继承,则要显式的表示才能继承,那么如果要重写方法,也是需要显式的标识
open class Base { open fun v() {} fun nv() {}}class Derived() : Base() { override fun v() {}}
在Derived中要重写Base的v方法,那么就需要Base的v方法有open修饰,如果没有open关键字修饰,那么就重写不了。那如果v只能继承到Derived,在Derived的子类则不再给重写,我们要怎么办?这时候,我们可以用另外一个关键字final
class Derived() : Base() { final override fun v() {}}
重写属性
重写属性和重写方法其实很类似,可以被重写的属性也是需要被open关键字修饰,重写属性的时候也是需要override关键字。
这里有一个很特殊的点,如果一个属性被修饰为val,但在子类中却可以重写为var,从val可以改var,从var改为val却不可以。
==重写规则==
在Kotlin中,实现和继承都要遵从以下规则:
- 如果一个类中,父类和实现的接口中有相同的成员名时,它必须要重写这个成员并提供自己的实现(或者直接使用继承),我们使用super关键字和尖括号来调用父类的方法,
open class Person(name: String) { open val age = 11; open var position = "Manager"; constructor(name: String, parent: Person) : this(name, 11) { } constructor(name: String, age: Int) : this(name) { } open fun testOverRide() { }}open class App(name: String) : Person(name) { final override fun testOverRide() { } override var age = 112; open fun f() { print("it is App f fun") }}interface B { fun f() { print("interface is not abstract"); }}class Bpp(name: String) : B, App(name) { override var position = "aads"; //编译器会强制要求重写 override fun f() { super<App>.f()//选择1 //super<B>.f()//选择2 }}
在B和App中,各自的实现都有一种方法,但在Bpp中,因为有同名的方法存在,因此在Bpp中是必须要重写,换一种说法就是,在Bpp中也必须有f的实现,但它可以有两种选择实现,亦或者都不实现父类的,可自行实现,
- Kotlin-类和继承
- Kotlin 类和继承
- Kotlin-类和继承
- Kotlin-2.1-类和继承
- Android Kotlin入门-类和继承
- Kotlin语法(六)-类和继承
- Kotlin: if表达式、类和继承
- Kotlin学习之-5.1 类和继承
- Kotlin-08.类和继承(class/Inheritance)
- Kotlin 中的 类 和 继承 (一)
- Kotlin 学习笔记(三) 类和继承
- Kotlin 中的 类 和 继承 (二)
- Kotlin基础——类和继承
- [kotlin 系列] (s2_1)类和继承
- Kotlin 第六章:类和继承
- Kotlin 类与继承
- Kotlin 学习之类和继承
- android kotlin类和对象(一)-类和继承
- 在CentOS7下获取Mac地址的值
- 网络地址转换NAT和代理服务器
- easyui图片上传demo
- BP神经网络后向传播算法
- UBUNTU安装交叉编译工具arm-liunx-gcc-4.4.3
- Kotlin-类和继承
- 日常笔记系列之String.valueOf()用法
- react开发:从零开始搭建一个react项目
- 聊聊 extern 变量 或 函数
- ambari安装,相关的文档,我已经上传,包括截图。
- Python 获得命令行参数的方法
- 黑盒测试用例设计方法
- Java mail 邮件发送 附件文件名过长的问题 版本1.5及以上 spring
- Java设计模式-目录