我刚开始学考特林,就碰到了一个问题:
我有一个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)
}
2条答案
按热度按时间mctunoxg1#
如果要打印年龄,只需写入:
println(human.age)
.在您的示例中,将
growOld
方法添加到类中可能会更简洁,这样您就可以在对象上调用它。例如:vqlkdk9b2#
问题是你试图 print
human
对象本身。在幕后,它调用它的toString()
方法--每个类都有一个这样的方法,因为它定义在所有类派生的类型上。如果你不重写它,并提供一个漂亮的方法来“漂亮地打印”你的对象,它将使用默认的实现,基本上是对内存中对象的引用。你使用的很多类都有一个很好的
toString()
实现,例如,如果你打印了一个List
,你会得到["something", "that", "looks", "like", "this"]
。但是这个行为需要编码--你也需要为你的Person
类做这个!因此,您可以 * 覆盖 * 默认实现,如下所示:
override
关键字,您也会得到一个错误--这只是为了确保您不会意外地做错事情。在 IntelliJ 中,如果愿意,您可以执行 Ctrl+O 来覆盖现有函数。所以你可以这样做:
然后,当您在
print
语句或字符串(如"Details: $person"
或val details = "Details: " + person
)中使用它时,它将调用toString()
方法并获取您生成字符串。另一种方法是使用data class:
数据类是一种特殊的类,所有的“数据”都存放在构造函数中(作为属性,
val
或var
),然后您可以免费获得一些样板文件,其中使用了这些属性例如使用这些数据的equals()
和hashCode()
实现-以及这里的相关内容,它提供了一个toString()
实现,可以很好地打印name
和age
。数据类对于像这里这样的简单数据对象来说非常方便--但是在普通类中,自己重写
toString()
是一种通用的方法。如果需要,您仍然可以重写 * 数据类 * 的toString
--有时您可能需要更复杂的表示,或者更好的格式。或者您可能只想包含一些属性而忽略其他属性。您可以控制它如何打印自己!如果你只想打印
age
属性,或者使用你的对象中的数据打印任何东西,那么你只需要做Robin's answer says。你根本不需要一个toString()
实现(因为这是你通常使用对象的方式,所以你通常根本不需要为你自己的类写一个toString
)