一、类的定义
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