提示:本文为作者阅读Kotlin中文站学习笔记,建议读者移步Kotlin中文站学习完整教程。
数据类
开发中,我们经常需要创建一些只保存数据的类。Kotlin中,我们用data关键字定义一个数据类,编译器会自动从主构造函数中声明的所有属性生成以下成员:
如果这些函数中的任何一个在类体中显式定义,或继承自其基类,则不会自动生成。
为了保障生成的代码的一致性和有意义的行为,数据类必须满足以下要求:
data class Data(val arg1: String,val arg2:Int,val arg3:Boolean)
在JVM中,如果主构造函数中的所有参数都有默认值,则编译器会为其自动生成一个无参的构造函数,它会使用默认值。
data class Data(val arg1: String="",val arg2:Int=0,val arg3:Boolean=true)
我们可以通过copy函数,复制一个对象,改变它的一部分属性,其它属性不变:
var data=Data();
var anotherData=data.copy(arg1 = "Hello Kotlin!",arg2 = 100)//改变data对象的arg1属性值为"Hello Kotlin!",arg2属性值为100,arg3属性值保持不变
编译器为data类主构造函数中各属性生成的componentN函数,使它们可以在解析赋值中使用:
fun printData(){
var data=Data()
var anotherData=data.copy(arg1 = "Hello Kotlin!",arg2 = 100)//改变data对象的arg1属性值为"Hello Kotlin!",arg2属性值为100,arg3属性值保持不变
var (arg1,arg2,arg3)=anotherData
print("arg1=$arg1&arg2=$arg2&arg3=$arg3")//arg1=Hello Kotlin!&arg2=100&arg3=true
}
密封类
密封类用来表示受限的类继承结构:当一个值为有限集中的类型、而不能有任何其他类型时。在某种意义上,他们是枚举类的扩展:枚举类型的值集合也是受限的,但每个枚举常量只存在一个实例,而密封类的一个子类可以有可包含状态的多个实例。
要声明一个密封类,需要在类名前面添加 sealed 修饰符。虽然密封类也可以有子类,但是所有子类都必须在与密封类自身相同的文件中声明。
请注意,扩展密封类子类的类(间接继承者)可以放在任何位置,而无需在同一个文件中。
使用密封类的关键好处在于使用 when 表达式 的时候,如果能够验证语句覆盖了所有情况,就不需要为该语句再添加一个 else 子句了。
sealed class Color//密封类
class Yello:Color()//黄色
class Red:Color()//红色
class Blue:Color()//蓝色
fun printColor(color:Color){
when(color){
is Yello-> print("The color is Yello!")
is Red-> print("The color is Red")
is Blue-> print("The color is Blue")
}
}
嵌套类
Kotlin中,一个类可以嵌套到另一个类中,这样的类叫嵌套类
//外部类
class Outer{
var arg1:String=""
fun foo(){
print("foo in Outer")
}
//嵌套类
class Nested{
fun foo(){
print("foo in Nested")
}
}
}
内部类
与嵌套类相似,内部类也是生命在另一个类的内部,但与嵌套类不同的是,内部类带有一个外部类对象的引用,因此,可以访问外部类的成员。内部类用inner关键字标注。
//外部类
class Outer{
var arg1:String=""
fun foo(){
print("foo in Outer")
}
//内部类
inner class Inner{
fun foo(){
print("foo in Inner")
print(this@Outer.arg1)//访问Outer类中的成员属性
this@Outer.foo()//访问Outer类中过的成员函数
}
}
}
枚举类
Kotlin中,用enum关键字标注一个枚举类,每个枚举常量都是枚举类的一个实例,枚举常量以逗号分隔:
//枚举类
enum class RGB{
Red,Green,Blue
}
每个枚举常量都有获取其名称和位置的属性
val name: String
val ordinal: Int
可以通过以下方式获取到所有的枚举常量,或某一个枚举常量:
/枚举类
enum class RGB{
Red,Green,Blue
}
fun printRgb(rgb:RGB){
RGB.values()//获取RGB所有的枚举常量
var red:RGB=RGB.valueOf("Red")//获取RGB名称为Red的枚举常量
print(red.name)// Red
print(red.ordinal)// 0
//kotlin 1.1起
enumValues()//获取RGB所有的枚举常量
enumValueOf("Red")//获取RGB名称为Red的枚举常量
}