多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
## 数据类 官方参考文档——[类与对象-数据类](https://www.kancloud.cn/alex_wsc/android_kotlin/1318306) 在Java程序中,一般会用一些类来保存一些数据或者对象的状态,习惯上将这些类称为bean类或entity类或model类。在Kotlin中,专门处理这些数据的类被称为数据类,用关键字data进行标记。数据类的语法格式如下: ``` data class类名([形参1,形参2…]) ``` 上述语法格式中,“类名([形参1,形参2…])”是该类的主构造函数,形参1、形参2…是该函数中需要传递的参数。定义一个数据类时,必须注意以下几点。 数据类的主构造函数至少有一个参数,如果需要一个无参的构造函数,可以将构造函数中的参数都设置为默认值。 * 数据类中的主构造函数中传递的参数必须用val或var来修饰。 * 数据类不可以用abstract、open、sealed或inner关键字来修饰。 * 在Kotlin 1.1版本之前数据类只能实现接口,1.1版本之后数据类可以继承其他类。 * 编译器可以自动生成一些常用方法,如equals()、hashCode()、toString()、componentN()、copy()等,这些方法也可以进行自定义。 Kotlin在类创建方面花了很多心思,让我们创建类变的非常方便,简化了代码。Kotlin为我们提供了一种特定的类,数据类。**在类定义的时候,通过在最前面加上data关键字,就可以标明这个类是一个数据类**。**如果一个类被标明为数据类,编译器在编译的时候会自动帮我们覆写常用的toString、hashCode、equals、copy、comopinentX**方法。 * toString方法,方便做日志输出,非常方便。 * hashCode、equals方法,方便对象比较,非常方便。 * copy方法,方便做对象复制,非常方便。 * comopinentX方法,可以很方面的解析对象包含的变量,非常强大。 比如,我们把包含name属性和age属性的Person类,定义为数据类,参考代码: ~~~ data class PersonData(val name: String, val age: Int) fun main(args: Array<String>) { val person = PersonData("小翠", 18) val person1 = PersonData("小丽", 20) println("--------封装好了toString方法--------") println(person) println(person1) println("--------封装好了hashCode和equals方法--------") println("person == person1:${person == person1}") println("person === person1:${person === person1}") println("--------封装好了copy方法-单纯copy--------") val person2 = person1.copy() println(person2.toString()) println("--------封装好了copy方法-copy的时候改特定的值--------") val person3 = person1.copy("小红") println(person3.toString()) println("--------封装好了comopinentx方法-可以进行解析析构--------") val (name, age) = person3 println("name: ${name},age: ${age}") } ~~~ 运行结果 ``` --------封装好了toString方法-------- PersonData(name=小翠, age=18) PersonData(name=小丽, age=20) --------封装好了hashCode和equals方法-------- person == person1:false person === person1:false --------封装好了copy方法-单纯copy-------- PersonData(name=小丽, age=20) --------封装好了copy方法-copy的时候改特定的值-------- PersonData(name=小红, age=20) --------封装好了comopinentx方法-可以进行解析析构-------- name: 小红,age: 20 Process finished with exit code 0 ``` 显然,数据类可是大大提高了生产力,为了验证编译器的生成情况,我们可以查看Kotlin编译转换的字节码文件对应Java文件的Structure,参考截图: ![](http://upload-images.jianshu.io/upload_images/7368752-d1f71933bdd28bd1.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 针对以上代码的第33行重点去说一下,这种做法,称作Kotlin的解析析构,可以把一个对象的值赋值给多个变量,要求这个类中包含comopinentX方法,比如,我们这里的Person包含了component1方法和component2方法。对于如下的写法 ![image.png](http://upload-images.jianshu.io/upload_images/7368752-af9eb738f38ea551.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)