使用println作为类实例时的Kotlin奇怪输出

时间:2019-05-21 08:58:12

标签: kotlin

我得到Person @ 4b67cf4d作为输出。

fun main(args: Array<String>){
    var person = Person("Jimmy")
    println(person)
}


class Person(val name: String){
    var age = 10
}

输出应为Jimmy。抱歉,如果我不够清楚,我才开始学习Kotlin,无法为此找到解决方案。

4 个答案:

答案 0 :(得分:4)

您必须在toString()类内重写方法Person

class Person(val name: String){
    var age = 10

    override fun toString(): String {
        return name
    }
}

现在您的代码将打印:

Jimmy

而不是哈希码。

答案 1 :(得分:2)

您应该打印对象Person的名称变量。

所以它就是println(person.name)

通过使用println(person),您只是在打印对象实例哈希值

顺便说一句。您可以将班级内联为class Person(val name: String, var age: Int = 10)

答案 2 :(得分:1)

简短答案:覆盖toString()

Java和Kotlin具有将任何对象转换为String的标准方法:toString()方法。

这是在顶级类java.lang.Objectkotlin.Any中定义的,因此可以确保每个对象都具有此方法。那里的实现只返回类名,后跟'@'和对象hashcode的十六进制表示。 (它们必须适用于每种可能的对象类型,因此它们没有其他要使用的信息。)

这就是您在输出中看到的。

如果您希望您的班级展示更有意义的内容,则应在toString()类中重写Person方法。例如,根据要求显示名称:

override fun toString() = name

但是,实际上,这并不总是最好的方法。每当您的对象打印到日志,错误消息等类似内容时,toString()就会被调用,因此,使用一个比较明确的表示形式会更有用,例如:

override fun toString() = "Person($name, $age)"

(或者,您可以将其设置为data class,它将自动提供合适的toString()实现以及其他一些功能。)

当您只想打印名称时,您可以明确地这样做:

println(person.name)

或者您可以提供单独的调用方法,例如:

fun toPrettyString() = name

然后:

println(person.toPrettyString())

这会使您的意图更加清晰。

答案 3 :(得分:0)

只需使用data class

fun main(args: Array<String>){
    var person = Person("Jimmy")
    println(person)
}


data class Person(val name: String, var age = 10)

输出为

Person(name=Jimmy,age=10)

如果您想精确输出“吉米”,则输出name字段:)

fun main(args: Array<String>){
    var person = Person("Jimmy")
    println(person.name)
}
相关问题