Kotlin中类、接口的定义以及类型转换

1,539 阅读3分钟

一、类的定义

class SimpleClass(var x:Int){
    
}

Kotlin中class声明一个类默认就代表了public属性,括号中代表了SimpleClass的构造方法,加上var就一并定义了一个x的属性,如果是类似Java的实现就是下面这样:

class SimpleClass(x:Int){
    var x:Int = x
}

相当于我们Java中的写法:

public class SimpleClass{
    private int x;
    public SimpleClass(int x){
        this.x= x;
    }
}

这样看,Kotlin的类声明和构造方法写法比Java简单很多了。

二、接口定义

Kotlin的接口定义和Java无异,只是去掉public关键字即可:

interface SimpleInf{
    fun simpleFun()
}

接口实现

class SimpleClass(var x:Int):SimpleInf{
    override fun simpleFun(){
    
    }
}

三、抽象类

Kotlin的抽象类也基本和Java一样,但是有一点要注意的是Kotlin中抽象类的普通方法必须要使用open关键字修饰才能被实现类覆写(如果继承一个非抽象类,该类也要使用open关键字修饰才可被继承).

abstract class AbsClass{
   //实现类要实现的方法
   abstract fun absFun()
   //实现类可覆写的方法
   open fun openFun()
   //实现类不可覆写的方法
   fun justFun()
}

继承类

//如果再创建一个类继承SimpleClass,那必须这样修饰:open class SimpleClass(..),
class SimpleClass(var x:Int):AbsClass(),SimpleInf{
    
    override fun adsFun(){ //如果使用final修饰这个覆写方法,那继承SimpleClass的类就不可覆写该方法了
    
    }

    override fun simpleFu(){
    
    }
    //覆写是否都可 
    override fun openFun(){
    
    }
}

属性引用

class Person(name:String,age:Int){
    var name:String = age
    var age:Int = age
}

//引用
val nameRef = Person::name
val person = Person("Qisan","18")
//赋值 这种情况是没有name没有绑定实际的receiver ,所以需要传person
nameRef.set(person,"Jack")

val ageRef = person::age
//ageRef 已绑定到实际的person,直接设置值
ageRef.set(25)

空类型安全,Kotlin对于Java而言的一大优势之一

//这样定义就是一个不可空类型
var nonNullStr:String = "Kt"
//nonNullStr = null 是不可赋值的,idea会报错
val length = nonNullStr.length //这样使用是完全安全,不用判断为空

因为在开发中,我们往往需要赋值为空,比如清除数据回复初始化状态,那如果变量要接受空值,需要这样定义

//String后面加一个?号
var nonNullStr:String? = "Kt"
nonNullStr = null
//这个时候如果不判空 直接使用nonNullStr去操作会有风险
//加上!! 强转不可空类型,不是最佳实现
//val length = nonNullStr!!.length 
//安全访问 这个意思是 nonNullStr?.length返回为空 就返回0给length,这样length就类型安全
val length = nonNullStr?.length ?:0 //elvis运算符 类似于java中的 a>b ? a:b

四、类型转换

定义一个接口,并让一个类去实现它:

interface KtClass{

}

class Person(name:String,age:Int):KtClass{
    var name:String = age
    var age:Int = age
}

使用接口KtClass获取Person的实例化对象

val ktClass:KtClass = Person("Max",28)

if(ktClass is Person){
    println(ktClass.name) //直接访问 is的判断已经自动强转了 Java中直接使用(Person)ktClass转换
}

//如果不判断直接调用 
println((ktClass as? Person)?.name) //as? 安全转换,失败返回null