1、数据类
data class 类名(var/val 参数1, var/val 参数2) {
}
2、数据类注意事项
- 数据类的主构造函数至少有一个参数
- 数据类中的主构造函数中传递的参数必须用val或var来修饰
- 数据类不可以用abstract、open、sealed或inner关键字来修饰。
- 在Kotlin 1.1版本之前数据类只能实现接口,1.1版本之后数据类可以继承其他类
- 编译器会自动生成常用方法,如equals()、hashCode()、toString()、componentN()、copy()等
如果需要一个无参的构造函数,将所有属性提供默认值即可:
data class ResponseResultBeanData2(var msg: String="", var code: Int=200, var data: String=""){
}
3、数据类的解构 componentN()
数据类自动生成解构函数component1、component2、…componentN 对应于属性的声明顺序
//解构
val (loginName, code, data) = ResponseResultBeanData("loginSuccess", 200, "登录成功数据....")
println("解构信息loginName=$loginName,code=$code,data=$data")
输出
解构信息loginName=loginSuccess,code=200,data=登录成功数据....
4、普通类与数据类的区别
class ResponseResultBean(var msg: String, var code: Int, var data: String) {
//编译器生成 get set 构造函数
}
data class ResponseResultBeanData(var msg: String, var code: Int, var data: String) {
//编译器生成 get set 构造函数 解构操作 copy toString hashCode equals
}
1、普通类、数据分别进行toString
//普通类继承Any toString未重写,所以是Windows实现了打印
println(ResponseResultBean("loginSuccess", 200, "登录成功数据...."))
//数据类继承了Any toString重写了,调用重写后的toString
println(ResponseResultBeanData("loginSuccess", 200, "登录成功数据...."))
由于数据类对toString的重写输出内容有所区别
com.example.mykotlin2.classs.ResponseResultBean@266474c2
ResponseResultBeanData(msg=loginSuccess, code=200, data=登录成功数据....)
2、普通类、数据分别进行==判断
//普通类未重写equals方法,Any类比较的是对象的引用
println(
ResponseResultBean("loginSuccess", 200, "登录成功数据....") ==
ResponseResultBean("loginSuccess",200,"登录成功数据....")
)
//数据重写了equals方法,对值进行了比较
println(
ResponseResultBeanData("loginSuccess",200,"登录成功数据....") ==
ResponseResultBeanData("loginSuccess", 200, "登录成功数据....")
)
由于数据类对equals的重写,对比的是值,而不是对象的引用
false
true
总结:上面两个例子都很好的说明了数据类提供了更多常用方法
5、数据类的继承
Kotlin 1.1之后的版本可以继承其他类,但是不能继承数据类
open class LoginBean(var info: String) {
open fun showInfo(): String {
return "info=$info"
}
}
data class LoginBeanData2(var loginName: String, var loginPwd: String) : LoginBean(loginName) {
override fun showInfo(): String {
return "loginName=$loginName"
}
}
6、数据类的copy
前面内容可知数据类会自动提供copy函数让我们使用
举例数据类LoginBeanData3
data class LoginBeanData3(var name: String, var pwd: String) {
var info = ""
constructor(info: String, name: String, pwd: String) : this(name, pwd) {
this.info = info
}
override fun toString(): String {
return "info=$info,name=$name,pwd=$pwd"
}
}
数据类copy的调用
println()
val loginBeanData3 = LoginBeanData3("kotlin登录信息描述", "kotlin", "123456")
println(loginBeanData3)
val copyBean = loginBeanData3.copy("java", "456789")
println(copyBean)
输出:从输出内容可看出,copy出来的对象没有info信息
info=kotlin登录信息描述,name=kotlin,pwd=123456
info=,name=java,pwd=456789
数据类copy注意事项:
- copy、toString、hashCode等数据自动生成的方法之管主构造函数
- 使用copy等函数的时候由于系统只处理了主构造我们需要要特别注意次构造的参数内容
7、完整代码
class ResponseResultBean(var msg: String, var code: Int, var data: String) {
//编译器生成 get set 构造函数
}
data class ResponseResultBeanData(var msg: String, var code: Int, var data: String) {
//编译器生成 get set 构造函数 解构操作 copy toString hashCode equals
}
data class ResponseResultBeanData2(
var msg: String = "",
var code: Int = 200,
var data: String = ""
)
open class LoginBean(var info: String) {
open fun showInfo(): String {
return "info=$info"
}
}
//数据类继承普通类
data class LoginBeanData2(var loginName: String, var loginPwd: String) : LoginBean(loginName) {
override fun showInfo(): String {
return "loginName=$loginName"
}
}
data class LoginBeanData3(var name: String, var pwd: String) {
var info = ""
constructor(info: String, name: String, pwd: String) : this(name, pwd) {
this.info = info
}
override fun toString(): String {
return "info=$info,name=$name,pwd=$pwd"
}
}
fun main() {
val (loginName, code, data) = ResponseResultBeanData("loginSuccess", 200, "登录成功数据....")
println("解构信息loginName=$loginName,code=$code,data=$data")
println()
//普通类继承Any toString未重写,所以是Windows实现了打印
println(ResponseResultBean("loginSuccess", 200, "登录成功数据...."))
println()
//数据类继承了Any toString重写了,调用重写后的toString
println(ResponseResultBeanData("loginSuccess", 200, "登录成功数据...."))
println()
println(ResponseResultBeanData2())
//前面我们学习 ==值的比较相当于 java的equals ===引用 对象比较
println()
//普通类未重写equals方法,Any类比较的是对象的引用
println(
ResponseResultBean("loginSuccess", 200, "登录成功数据....") == ResponseResultBean(
"loginSuccess",
200,
"登录成功数据...."
)
)
//数据重写了equals方法,对值进行了比较
println(
ResponseResultBeanData(
"loginSuccess",
200,
"登录成功数据...."
) == ResponseResultBeanData("loginSuccess", 200, "登录成功数据....")
)
println()
val loginBeanData3 = LoginBeanData3("kotlin登录信息描述", "kotlin", "123456")
println(loginBeanData3)
val copyBean = loginBeanData3.copy("java", "456789")
println(copyBean)
}