Kotlin教程:Data数据类

2020-04-2311:33:15编程语言入门到精通Comments1,520 views字数 3897阅读模式

数据类是一个简单的类,用于保存数据/状态并包含标准功能(函数)。 data关键字用于将类声明为数据类。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18302.html

data class User(val name: String, val age: Int)
Kotlin

声明数据类必须至少包含一个带有属性参数(valvar)的主构造函数。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18302.html

数据类内部有以下函数:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18302.html

  • equals(): Boolean
  • hashCode(): Int
  • toString(): String
  • component() 函数对应的属性
  • copy()

由于数据类内部存在上述函数,因此数据类消除了反复套用代码。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18302.html

*Java数据类和Kotlin数据类的比较文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18302.html

如果想使用数据类在Java中创建用户数据项,则需要大量反复套用的代码。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18302.html

import java.util.Objects;

public class User {
    private String name;
    private int id;
    private String email;

    public User(String name, int id, String email) {
        this.name = name;
        this.id = id;
        this.email = email;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public intgetId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof User)) return false;
        User user = (User) o;
        return getId() == user.getId() &&
                Objects.equals(getName(), user.getName()) &&
                Objects.equals(getEmail(), user.getEmail());
    }

    @Override
    public inthashCode() {

        return Objects.hash(getName(), getId(), getEmail());
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", id=" + id +
                ", email='" + email + '\'' +
                '}';
    }
}
Java

使用User类的对象,调用上述Java数据类的构造函数,如下所示 -文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18302.html

class MyClass{
    public static void main(String agrs[]){
        User u = new User("Susen",10010,"yiibai@mail.com");
        System.out.println(u);
    }
}
Java

执行上面示例代码,得到以下结果 -文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18302.html

User{name='Susen', id=10010, email='yiibai@mail.com'}
Shell

上述Java数据类代码在Kotlin数据代码中使用一行重写完事 -文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18302.html

data class User(var name: String, var id: Int, var email: String)
Kotlin

使用User类的对象调用上述Kotlin数据类的构造函数 -文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18302.html

data class User(var name: String, var id: Int, var email: String)

fun main(agrs: Array<String>) {
    val u = User("Maxsu", 10010, "maxsu@yiibai.com")
    println(u)
}
Shell

执行上面示例代码,得到以下结果 -文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18302.html

User{name='Maxsu', id=10010, email='maxsu@yiibai.com'}
Shell

数据类的要求

要创建数据类,首先需要满足以下要求:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18302.html

  • 包含具有至少一个参数的主构造函数。
  • 主构造函数的参数标记为valvar
  • 数据类不能是抽象的,内部的,开放的或密封的。
  • 1.1版本之前,数据类只实现接口。1.1版本之后,数据类可以扩展其他类。

Kotlin数据类toString()方法

Kotlin数据类仅关注数据而非代码实现。
下面来看一个没有数据类的简单程序。 在这个类中,尝试使用对象打印Product类的引用。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18302.html

class Product(varitem: String, var price: Int)

fun main(agrs: Array<String>) {
    val p = Product("Thinkpad", 5600)
    println(p)
}
Kotlin

在打印Product类的引用时,它会显示类名为ProducthashCode()。它不打印对象属性的数据。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18302.html

执行上面示例代码,得到以下结果 -文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18302.html

Product@5e2de80c
Shell

上述程序使用数据类(data class)重写,打印Product类的引用并显示对象的数据。上面代码中之所以发生这种情况,是因为数据类内部包含toString()方法,它默认只是显示对象的字符串表示形式。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18302.html

data class Product(var item: String, var price: Int)

fun main(agrs: Array<String>) {
    val p = Product("Thinkpad", 5600)
    println(p)
}
Kotlin

执行上面示例代码,得到以下结果 -文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18302.html

Product(item=Thinkpad, price=5600)
Shell

Kotlin数据类equals()和 hashCode()方法

equal()方法用于检查其他对象是否“等于”当前对象。 在两个或多个hashCode()之间进行比较时,如果hashCode()相等,则equals()方法返回true,否则返回false文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18302.html

例如,让我们看一个例子,一个普通类比较具有相同数据的Product类的两个引用。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18302.html

class Product(var item: String, var price: Int)

fun main(agrs: Array<String>) {
    val p1 = Product("Thinkpad", 5000)
    val p2 = Product("Thinkpad", 5000)
    println(p1==p2)
    println(p1.equals(p2))
}
Kotlin

在上述程序中,引用p1和引用p2具有不同的引用。 由于p1p2中的引用值不同,所以进行比较结果为false文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18302.html

执行上面示例代码,得到以下结果 -文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18302.html

false
false
Shell

上述程序使用数据类重写,打印Product类的引用并显示对象的数据。
hashCode()方法返回对象的哈希码。 如果两个对象相等,则hashCode()会产生相同的整数结果。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18302.html

data class Product(var item: String, var price: Int)

fun main(agrs: Array<String>) {
    val p1 = Product("Thinkpad", 5000)
    val p2 = Product("Thinkpad", 5000)
    println(p1==p2)
    println(p1.equals(p2))
}
Kotlin

执行上面示例代码,得到以下结果 -文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18302.html

true
true
Shell

Kotlin数据类copy()方法

数据类提供了一个copy()方法,用于创建对象的副本(或冒号)。 使用copy()方法,可以更改对象的部分或全部属性。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18302.html

示例:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18302.html

data class Product(var item: String, var price: Int)

fun main(agrs: Array<String>) {
    val p1 = Product("Thinkpad", 5000)
    println("p1 包含数据为: $p1")
    val p2 = p1.copy()
    println("p2 拷贝对象包含p1的默认数据为:: $p2")
    val p3 = p1.copy(price = 20000)
    println("p3 包含 p1 和修改后的数据为 : $p3")
}
Kotlin

执行上面示例代码,得到以下结果 -文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18302.html

p1 包含数据为: Product(item=Thinkpad, price=5000)
p2 拷贝对象包含p1的默认数据为:: Product(item=Thinkpad, price=5000)
p3 包含 p1 和修改后的数据为 : Product(item=Thinkpad, price=20000)
Shell

数据类的默认和命名参数

还可以在数据类的主构造函数中分配默认参数。 如果需要,可以稍后在程序中更改这些默认值。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18302.html

示例:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18302.html

data class Product(var item: String = "Apple Mac", var price: Int = 15000)

fun main(agrs: Array<String>) {
    val p1 = Product(price = 20000)
    println(p1)
}
Kotlin

执行上面示例代码,得到以下结果 -文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18302.html

Product(item=Apple Mac, price=20000)

//原文出自【易百教程】,商业转载请联系作者获得授权,非商业转载请保留原文链接:https://www.yiibai.com/kotlin/kotlin-data-class.html#article-start文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18302.html

文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18302.html
  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/ymba/18302.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定