Kotlin使用class关键字声明类,类声明由类名、类头(指定其类型参数、主 构造函数等)和由大括号包围的类体组成。

类头和类体都是可选的,如果一个类没有类体大括号可省略

classNoBody


类的构造函数

一类可以有一个主构造函数和一个或多个次构造函数。主构造函数是类头的一部分:它跟在类名(和可选的类型参数)后

主构造函数不能包含任何代码块,可用init块初始化代码,并且可访问主构造函数的参数

classPersonconstructor(firstName:String){init{println(firstName)}}

如果类头没有任何注解或者可见性修饰符,constructor关键字可省略

classPerson2(firstName:String){init{println(firstName)}}

如果构造函数有注解或可见性修饰符,这个constructor关键字是必需的,并且这些修饰符在它前面

classPerson3publicconstructor(firstName:String){init{println(firstName)}}


次构造函数

类也可以声明次构造函数

classAnimal{constructor(name:String){println(name)}}

如果一个类有主构造函数,每个次构造函数都需要委托给主构造函数,可以直接委托或者通过其它次构造函数间接委托

使用this关键字直接委托给当前类的主构造函数

classAnimal2(name:String){constructor(name:String,age:Int):this(name){println(name+age)}init{println(name)}}

如果一非抽象类没有任何主或者次构造函数,它会默认生成一个不带参的主构造函数

classAnimal3{}

等同于

classAnimal3(){}

将构造函数用private修饰可以防止被创建类的实例

classDontCreateprivateconstructor(){}


创建类的实例

类定义后,需要创建实例才能使用

funmain(args:Array<String>){//实例化,Kotlin类的实例化省去了new关键字varperson=Person("zhangsna")varperson1=Animal3()println(person)println(person1)//private修饰符修饰的构造方法不能实例化//vardontCreate=DontCreate()}


继承

Kotlin和Java一样都有隐式继承,Java中一个类如果没有显示的继承一个类默认继承Object

而Kotlin中默认继承Any

classExample//隐式继承Any

Any中只有 equals()、hashCode()和toString()三个方法。附Any类源码图

在Kotlin中所有的类默认为final类型,是不能够被继承的。如果该类需要被继承则必须加上open关键字否则该类编译成class后是一个final类

openclassBase{}

使用:符号实现继承,继承的父类必须初始化

classCar:Base(){}

如果父类主构造函数有参数子类必须声明一个有参数的主构造函数初始化父类的构造函数

openclassDevice(name:String){init{println(name)}}classPhone(name:String):Device(name){}

如果父类没有主构造函数,那么子类每个次构造函数都必须使用super关键字调初始化父类次构造函数

openclassDevice2{constructor(name:String){println(name)}constructor(type:Int,weight:Int){println("$type"+weight)}}classComputor:Device2{constructor(name:String):super(name)constructor(type:Int,weight:Int):super(type,weight)}


覆盖方法和属性

Kotlin中需要overried关键字显示的覆盖成员

openclassFather{openvara:Int=1openfunsay(){println("fathersay")}}classSon:Father(){//必须加上overried关键字,覆盖父类成员overridevara:Int=2overridefunsay(){println("sonsay")}}


抽象类和继承

使用abstract关键字定义抽象类

abstractclassAbstract{//定义抽象方法时,必能有方法体abstractfunabsFun()}classSub:Abstract(){//子类必须实现父类的抽象方法overridefunabsFun(){println("absFunofsub")}}