Kotlin 创建接口或者抽象类的匿名对象实例
一,定义接口和抽象类
interfaceIPerson{
//获取名字
fungetName():String
//获取身份证ID
fungetID():String
}
abstractclassBaseAnimal{
abstractfungetVoice():String
}
二,创建对应的匿名对象
object:IPerson{
overridefungetName():String="jason"
overridefungetID():String="00000123"
}
object:BaseAnimal(){
overridefungetVoice()="旺旺叫"
}
补充知识:androidKotlin继承、派生、接口、构造方式,方法、属性重写
前言
kotlin作为google官方android开发语言,大势所趋,据传到2018底kotlin要全面替代java在android中的地位,其实这个也不担心毕竟kotin和java可以100%互操作。两种语言进行编写也是可以的。
Kotlin继承
1.使用open关键字进行修饰
2.主构造函数紧跟着在类后面声明的函数
openclassPerson(varname:String,varage:Int){//基类
}
classStudent(name:String,age:Int,varno:String,varscore:Int):Person(name,age){
}
//二级构造函数
calssStudent:Person{
constructor(ctx:Context):super(ctx){
}
constructor(ctx:Context,attrs:AttributeSet):super(ctx,attrs){
}
}
另一种写法,基类构造函数,次级构造函数
/**用户基类**/
openclassPerson(name:String){
/**次级构造函数**/
constructor(name:String,age:Int):this(name){
//初始化
println("-------基类次级构造函数---------")
}
}
/**子类继承Person类**/
classStudent:Person{
/**次级构造函数**/
constructor(name:String,age:Int,no:String,score:Int):super(name,age){
println("-------继承类次级构造函数---------")
println("学生名:${name}")
println("年龄:${age}")
println("学生号:${no}")
println("成绩:${score}")
}
}
funmain(args:Array){
vars=Student("Runoob",18,"S12345",89)
}
方法重写
基类fun函数默认final修饰符,无法在子类进行重写
需要加上open修饰符号
方法获得,同名方法获得
一个类从其他类或者接口(继承实现来的方法),同名方法,在子类中必须显示进行调用
openclassA{
openfunf(){print("A")}
funa(){print("a")}
}
interfaceB{
funf(){print("B")}//接口的成员变量默认是open的
funb(){print("b")}
}
classC():A(),B{
overridefunf(){
super.f()//调用A.f()
super.f()//调用B.f()
}
}
funmain(args:Array){
valc=C()
c.f();
}
openclassA{
openfunf(){print("A")}
funa(){print("a")}
}
interfaceB{
funf(){print("B")}//接口的成员变量默认是open的
funb(){print("b")}
}
classC():A(),B{
overridefunf(){
super.f()//调用A.f()
super.f()//调用B.f()
}
}
funmain(args:Array){
valc=C()
c.f();
}
属性重写
属性重写使用override关键字,属性必须具有兼容类型,每一个声明的属性都可以通过初始化程序或者getter方法被重写:
openclassFoo{
openvalx:Intget{……}
}
classBar1:Foo(){
overridevalx:Int=……
}
你可以用一个var属性重写一个val属性,但是反过来不行。因为val属性本身定义了getter方法,重写为var属性会在衍生类中额外声明一个setter方法
你可以在主构造函数中使用override关键字作为属性声明的一部分:
interfaceFoo{
valcount:Int
}
classBar1(overridevalcount:Int):Foo
classBar2:Foo{
overridevarcount:Int=0
}
Kotlin接口
Kotlin接口与Java8类似,使用interface关键字定义接口,允许方法有默认实现:
interfaceMyInterface{
funbar()//未实现
funfoo(){//已实现
//可选的方法体
println("foo")
}
}
接口中的属性
接口中的属性只能是抽象的,不允许初始化值,接口不会保存属性值,实现接口时,必须重写属性:
interfaceMyInterface{
varname:String//name属性,抽象的
}
classMyImpl:MyInterface{
overridevarname:String="runoob"//重载属性
}
函数重写
实现多个接口时,可能会遇到同一方法继承多个实现的问题。例如:
实例
interfaceA{
funfoo(){print("A")}//已实现
funbar()//未实现,没有方法体,是抽象的
}
interfaceB{
funfoo(){print("B")}//已实现
funbar(){print("bar")}//已实现
}
classC:A{
overridefunbar(){print("bar")}//重写
}
classD:A,B{
overridefunfoo(){
super.foo()
super.foo()
}
overridefunbar(){
super.bar()
}
}
funmain(args:Array){
vald=D()
d.foo();
d.bar();
}
输出结果为:
ABbar
实例中接口A和B都定义了方法foo()和bar(),两者都实现了foo(),B实现了bar()。因为C是一个实现了A的具体类,所以必须要重写bar()并实现这个抽象方法。
然而,如果我们从A和B派生D,我们需要实现多个接口继承的所有方法,并指明D应该如何实现它们。
这一规则既适用于继承单个实现(bar())的方法也适用于继承多个实现(foo())的方法。
以上这篇Kotlin创建接口或者抽象类的匿名对象实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。