时间:2021-05-19
kotlin基础教程之类和继承
类声明
使用class关键字声明类,查看其声明格式:
: modifiers ("class" | "interface") SimpleName typeParameters? primaryConstructor? (":" annotations delegationSpecifier{","})? typeConstraints (classBody? | enumClassBody)最简略的类声明至少包括 modifiers class SimpleName,如:
class Emptymodifiers
包括classModifier和accessModifier:
classModifier: 类属性修饰符,标示类本身特性。 abstract //抽象类标示 final //标示类不可继承,默认属性 enum //标示类为枚举 open //类可继承,类默认是final的 annotation //注解类accessModifier: 访问权限修饰符
构造函数声明
可以声明一个主构造函数(primary constructor)和多个次级构造函数(secondary constructor),二者都是可选的。
primary constructor声明
作为类声明的头部存在,类声明结构:
class User constructor(name:String)当constructor前无修饰符(如:private)时,constructor可以省略:
class User(name:String)当是无参构造函数时,整个构造函数部分也可以省略,省略的构造函数默认是public的:
class Userprimary constructor 初始化
由于primary constructor不能包含任何代码,因此使用 init 代码块对其初始化,同时可以在初始化代码块中使用构造函数的参数:
class User(name:String){ init{ //初始化.. }}可以类中初始化属性:
class User(name:String){ var customName = name.toUpperCase() //初始化属性}secondary constructor声明
使用constructor前缀声明,且必须调用primary constructor,使用this关键字:
class User(name:String){ /**secondary constructor**/ constructor(name:String,age:Int):this(name){ //初始化... }}声明构造函数时,允许指定参数默认值,若所有参数都被指定默认值然后编译,编译器会生成一个额外的无参构造函数来使用初始化属性为初始值。
class User(name:String = “”)作为校验,上述声明方式允许如下调用:
var user = User()var anotherUser = User("jason")若构造函数中并非所有参数都有默认值,则不会生成默认无参构造函数:
class User(name:String = "",age = Int)var user = User() //将无法编译通过 var anotherUser = User("jason",18) //合法声明实例化
无需new关键字,即可实例化对象:
var user = User()继承(Inheritance)
Any
所有类都继承该类,提供默认的三个函数:
equals()hashCode()toString()继承声明
在类的构造函数之后使用 : 标示继承:
class Student(name:String,age:Int):User(name,age){}当类未声明构造函数时,继承其他类时,也不需要在primary constructor中显示的声明构造函数,必须在secondary constructor中显示调用父类构造函数,若父类有多个构造函数,可选择其一进行调用:
/**用户基类**/open class User(name:String){ /**secondary constructor**/ constructor(name:String,age:Int):this(name){ //初始化 }}/**子类继承User类**/class Student:User{ /**构造函数**/ constructor(name:String):super(name){ } /**另外一个构造函数**/ constructor(name:String,age:Int):super(name,age){ }}所有类定义时默认是final属性,不可被继承。若需要继承,使用open关键字进行修饰。
方法重载
方法默认是final的,不可被子类重载,若需要被重载,使用关键词 open 进行修饰,子类重载方法使用 override 关键词:
open class User{ open fun study(){} fun run(){}}class Student:User{ override fun study(){}}override修饰的方法,默认是可以被继承的。若希望不被继承,可以使用 final 关键词修饰。
final override fun study(){}重载规则
当类同时继承类和实现接口,且有相同方法,且相同方法都有实现时,需要在重载方法中调用所继承的方法,使用关键词 super ,T表示所继承或实现的接口:
open class User{ open fun study(){}}interface Reading{ fun study(){}}class Student:User(),Reading{ override fun study(){ super<User>.study() super<Reading>.study() //与上者至少二选其一 }}当接口未实现方法时,默认为父类User的study方法,不需要调用所继承的方法:
interface Reading{ fun study()}class Student:User(),Reading{ override fun study(){ //do nothing }}抽象类
Kotlin中的抽象类允许有abstract修饰的成员方法,非抽象类不允许有抽象方法;
abstract class User{ abstract fun study()}class Person{ abstract fun study() // 编译错误}抽象类默认是可被继承的,接口是特殊的抽象类,允许有抽象方法:
interface Reading{ abstract fun reading()}感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
Kotlin基础教程之类、对象、接口Kotlin中类、接口相关概念与Java一样,包括类名、属性、方法、继承等,如下示例:interfaceA{funbar()
Kotlin基础教程之数组容器ArraysKotlin标准库提供了arrayOf()创建数组,**ArrayOf创建特定类型数组valarray=arrayOf
Kotlin基础教程之操作符与操作符重载Kotlin操作符的使用方法与其他语言差不多,最大的特点就在于infixfunctioncall(事实上infixfun
Kotlin基础教程之反射概述反射是语言与库中的一组功能,可以在运行时刻获取程序本身的信息.在Kotlin中,不仅可以通过发射获取类的信息,同时可以获取函数和属
Kotlin基础教程之函数定义与变量声明可以看到,函数定义就是{函数体}单语句函数可以简写,比如add函数和add1函数效果是一样的变量定义var:=常量定义v