建立User类
package loaderman.demo class User(name: String) { val name: String = name }
package loaderman import loaderman.demo.User fun main(arg: Array<String>) { val user1 = User("haha") val user2 = User("haha") println(user1) println(user2) println(user1.equals(user2)) }
loaderman.demo.User@3cd1a2f1 loaderman.demo.User@2f0e140b false
如果重写类tostring和equals方法
package loaderman.demo class User(name: String) { val name: String = name override fun equals(other: Any?): Boolean { if (this === other) return true if (javaClass != other?.javaClass) return false other as User if (name != other.name) return false return true } override fun hashCode(): Int { return name.hashCode() } }
package loaderman import loaderman.demo.User fun main(arg: Array<String>) { val user1 = User("haha") val user2 = User("haha") println(user1) println(user2) println(user1.equals(user2)) }
loaderman.demo.User@30bfb2 loaderman.demo.User@30bfb2 true
这样可以满足我们的要求,但是如果每个表示数据的类都要重写这两个方法,都要加属性,很麻烦
数据类规定,属性要通过主构造器指定,而且数据类要在class关键字前面加data.因此,如果前面的User类用数据类的写法,就变成类下面的样子
package loaderman.demo data class User(var name: String) { }
package loaderman import loaderman.demo.User fun main(arg: Array<String>) { val user1 = User("haha") val user2 = User("haha") println(user1) println(user2) println(user1.equals(user2)) }
输出:
User(name=haha) User(name=haha) true
- 编写一个数据类需要注意的事项如下:
- 主构造器至少要有一个参数
- 主构造器的所有参数必须标记为val和var
- 数据类不能是抽象类,open类,封闭类或者内部类
由于数据类要求主构造器必须至少有一个参数,因此,在数据类中,不可能存在没有参数的主构造器,要想数据类拥有一个没有参数的构造器,可以有二种方法:
- 为主构造器每一个参数都加上默认值
- 添加一个么有参数的次构造器,并在调用主构造器事指定主构造器的默认值