intellij-idea 无法显示传递给kotlin函数的对象的存在时间

mcvgt66p  于 2022-11-01  发布在  Kotlin
关注(0)|答案(2)|浏览(97)

我刚开始学考特林,就碰到了一个问题:

我有一个Person类,它有两个字段-age(Int数据类型)-name(String数据类型)

还有一个*oldUp*函数,在该函数中我传递了一个Person对象并将该对象的age字段递增10。
在程序结束之前
我想显示传递给oldUp的对象的年龄
但是,年龄没有显示。
我代码:

class Person(var name: String, var age: Int){
}

fun growOld(human: Person){
    human.age+=10
}

fun main(args: Array<String>) {
    var human = Person("Kitty",6)
    growOld(human)
    println(human)
}
mctunoxg

mctunoxg1#

如果要打印年龄,只需写入:println(human.age) .
在您的示例中,将growOld方法添加到类中可能会更简洁,这样您就可以在对象上调用它。例如:

class Person(var name: String, var age: Int){
    fun growOld() {
        this.age += 10
    }
}

fun main() {
    var human = Person("Kitty", 6)
    println(human.age) // prints 6
    human.growOld()
    println(human.age) // prints 16
    println(human.name) // prints Kitty
}
vqlkdk9b

vqlkdk9b2#

问题是你试图 printhuman对象本身。在幕后,它调用它的toString()方法--每个类都有一个这样的方法,因为它定义在所有类派生的类型上。如果你不重写它,并提供一个漂亮的方法来“漂亮地打印”你的对象,它将使用默认的实现,基本上是对内存中对象的引用。
你使用的很多类都有一个很好的toString()实现,例如,如果你打印了一个List,你会得到["something", "that", "looks", "like", "this"]。但是这个行为需要编码--你也需要为你的Person类做这个!
因此,您可以 * 覆盖 * 默认实现,如下所示:

override fun toString(): String {
    // return a String here
}
  • override* 意味着您要使用一个现有的函数并编写自己的版本-如果这与您可以覆盖的现有函数不匹配,如果您 * 没有 * 为一个看起来与父类型中的现有函数完全相同的函数使用override关键字,您也会得到一个错误--这只是为了确保您不会意外地做错事情。在 IntelliJ 中,如果愿意,您可以执行 Ctrl+O 来覆盖现有函数。

所以你可以这样做:

// inside your Person class
override fun toString(): String {
    return "Name: $name, age: $age"
}

然后,当您在print语句或字符串(如"Details: $person"val details = "Details: " + person)中使用它时,它将调用toString()方法并获取您生成字符串。
另一种方法是使用data class

data class Person(var name: String, var age: Int)

数据类是一种特殊的类,所有的“数据”都存放在构造函数中(作为属性,valvar),然后您可以免费获得一些样板文件,其中使用了这些属性例如使用这些数据的equals()hashCode()实现-以及这里的相关内容,它提供了一个toString()实现,可以很好地打印nameage
数据类对于像这里这样的简单数据对象来说非常方便--但是在普通类中,自己重写toString()是一种通用的方法。如果需要,您仍然可以重写 * 数据类 * 的toString--有时您可能需要更复杂的表示,或者更好的格式。或者您可能只想包含一些属性而忽略其他属性。您可以控制它如何打印自己!
如果你只想打印age属性,或者使用你的对象中的数据打印任何东西,那么你只需要做Robin's answer says。你根本不需要一个toString()实现(因为这是你通常使用对象的方式,所以你通常根本不需要为你自己的类写一个toString

相关问题