kotlin基础教程之类和继承
kotlin基础教程之类和继承
类声明
使用class关键字声明类,查看其声明格式:
:modifiers("class"|"interface")SimpleName
typeParameters?
primaryConstructor?
(":"annotationsdelegationSpecifier{","})?
typeConstraints
(classBody?|enumClassBody)
最简略的类声明至少包括modifiersclassSimpleName,如:
classEmpty
modifiers
包括classModifier和accessModifier:
classModifier:类属性修饰符,标示类本身特性。 abstract//抽象类标示 final//标示类不可继承,默认属性 enum//标示类为枚举 open//类可继承,类默认是final的 annotation//注解类
accessModifier:访问权限修饰符
private//仅在同一个文件中可见 protected//同一个文件中或子类可见 public//所有调用的地方都可见 internal//同一个模块中可见
构造函数声明
可以声明一个主构造函数(primaryconstructor)和多个次级构造函数(secondaryconstructor),二者都是可选的。
primaryconstructor声明
作为类声明的头部存在,类声明结构:
classUserconstructor(name:String)
当constructor前无修饰符(如:private)时,constructor可以省略:
classUser(name:String)
当是无参构造函数时,整个构造函数部分也可以省略,省略的构造函数默认是public的:
classUser
primaryconstructor初始化
由于primaryconstructor不能包含任何代码,因此使用init代码块对其初始化,同时可以在初始化代码块中使用构造函数的参数:
classUser(name:String){
init{
//初始化..
}
}
可以类中初始化属性:
classUser(name:String){
varcustomName=name.toUpperCase()//初始化属性
}
secondaryconstructor声明
使用constructor前缀声明,且必须调用primaryconstructor,使用this关键字:
classUser(name:String){
/**secondaryconstructor**/
constructor(name:String,age:Int):this(name){
//初始化...
}
}
声明构造函数时,允许指定参数默认值,若所有参数都被指定默认值然后编译,编译器会生成一个额外的无参构造函数来使用初始化属性为初始值。
classUser(name:String=“”)
作为校验,上述声明方式允许如下调用:
varuser=User()
varanotherUser=User("jason")
若构造函数中并非所有参数都有默认值,则不会生成默认无参构造函数:
classUser(name:String="",age=Int)
varuser=User()//将无法编译通过
varanotherUser=User("jason",18)//合法声明
实例化
无需new关键字,即可实例化对象:
varuser=User()
继承(Inheritance)
Any
所有类都继承该类,提供默认的三个函数:
equals() hashCode() toString()
继承声明
在类的构造函数之后使用:标示继承:
classStudent(name:String,age:Int):User(name,age){
}
当类未声明构造函数时,继承其他类时,也不需要在primaryconstructor中显示的声明构造函数,必须在secondaryconstructor中显示调用父类构造函数,若父类有多个构造函数,可选择其一进行调用:
/**用户基类**/
openclassUser(name:String){
/**secondaryconstructor**/
constructor(name:String,age:Int):this(name){
//初始化
}
}
/**子类继承User类**/
classStudent:User{
/**构造函数**/
constructor(name:String):super(name){
}
/**另外一个构造函数**/
constructor(name:String,age:Int):super(name,age){
}
}
所有类定义时默认是final属性,不可被继承。若需要继承,使用open关键字进行修饰。
方法重载
方法默认是final的,不可被子类重载,若需要被重载,使用关键词open进行修饰,子类重载方法使用override关键词:
openclassUser{
openfunstudy(){}
funrun(){}
}
classStudent:User{
overridefunstudy(){}
}
override修饰的方法,默认是可以被继承的。若希望不被继承,可以使用final关键词修饰。
finaloverridefunstudy(){}
重载规则
当类同时继承类和实现接口,且有相同方法,且相同方法都有实现时,需要在重载方法中调用所继承的方法,使用关键词super,T表示所继承或实现的接口:
openclassUser{
openfunstudy(){}
}
interfaceReading{
funstudy(){}
}
classStudent:User(),Reading{
overridefunstudy(){
super.study()
super.study()//与上者至少二选其一
}
}
当接口未实现方法时,默认为父类User的study方法,不需要调用所继承的方法:
interfaceReading{
funstudy()
}
classStudent:User(),Reading{
overridefunstudy(){
//donothing
}
}
抽象类
Kotlin中的抽象类允许有abstract修饰的成员方法,非抽象类不允许有抽象方法;
abstractclassUser{
abstractfunstudy()
}
classPerson{
abstractfunstudy()//编译错误
}
抽象类默认是可被继承的,接口是特殊的抽象类,允许有抽象方法:
interfaceReading{
abstractfunreading()
}
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!