我知道这是一个非常基本的问题,但回答这个问题将解决我的许多疑问。
val new_parent = ParentDetails(intent.extras.getString("name"),
intent.extras.getString("email"),
intent.extras.getString("parent_relation"),
intent.extras.getString("locationdata"))
println(new_parent.tostring())
上面的代码不会打印类中存在的各种字段及其值。
ParentDetails
是我使用一些初始化的字段创建的模型。ParentDetails
模型:
class ParentDetails {
var parent_id: Int = 0
var parent_name: String = ""
var parent_email: String = ""
var parent_relation: String = ""
var parent_location: String=""
constructor(parent_name: String, parent_email: String, parent_relation: String,parent_location:String) {
this.parent_name = parent_name
this.parent_email = parent_email
this.parent_relation = parent_relation
this.parent_location = parent_location
}
public fun getparentId(): Int {
return parent_id
}
fun ParentDetailsprintme() {
println(parent_name)
println(parent_email)
println(parent_relation)
println(parent_location)
}
}
实际上,它打印null并访问单个字段,它打印空字符串(初始化方式(。
我们如何解释这一点?
据我了解,您的问题是调用println(new_parent.tostring())
不会打印您想要在函数ParentDetailsprintme
中打印的内容。
首先,您有一个错字,正确的调用是new_parent.toString()
.
请注意,它可以简化为println(new_parent)
.
它不会打印您在ParentDetailsprintme
方法中定义的内容,因为不会调用该方法。
println(new_parent.toString())
打印的内容实际上是对象的哈希代码,因为这是每个对象的默认行为。
要使其正常工作,请像println(new_parent.ParentDetailsprintme())
一样调用它或覆盖toString()
方法,例如:
override fun toString() = "$parent_name $parent_email $parent_relation $parent_location"
然后以下
val new_parent = ParentDetails("myName", "myEmail", "myParent_relation", "myLocationdata")
println(new_parent)
应该打印
myName myEmail myParent_relation myLocationdata
Kotlin 的println
函数只是在引擎盖下调用System.out.println(message)
,这将调用String.valueOf()
(例如String.valueOf(Object object)
对象,这将调用所传递对象的toString()
方法(。
/** Prints the given message and newline to the standard output stream. */
@kotlin.internal.InlineOnly
public inline fun println(message: CharArray) {
System.out.println(message)
}
更新("使用数据类方法也有效">(:
如果使类成为数据类:
data class ParentDetails(
val parent_id: Int = 0,
val parent_name: String = "",
val parent_email: String = "",
val parent_relation: String = "",
val parent_location: String = ""
)
然后你执行
val new_parent = ParentDetails(0, "myName", "myEmail", "myParent_relation", "myLocationdata")
println(new_parent)
您将收到结果
ParentDetails(parent_id=0, parent_name=myName, parent_email=myEmail, parent_relation=myParent_relation, parent_location=myLocationdata)
这是因为数据类覆盖了toString()
函数:
编译器自动从所有成员中派生以下成员 在主构造函数中声明的属性:
- 等于((/哈希代码(( 对;
- toString(( 的形式为 "User(name=John, age=42(";
您是否检查过是否从intent.extras
接收到有效数据?
另外,我建议您为模型使用data class
。 它将看起来像这样:
data class ParentDetails(
var parent_id: Int = 0,
var parent_name: String = "",
var parent_email: String = "",
var parent_relation: String = "",
var parent_location: String = ""
)
您将能够像这样使用它:
val new_parent = ParentDetails(
parent_name = intent.extras.getString("name"),
parent_email = intent.extras.getString("email"),
parent_relation = intent.extras.getString("parent_relation"),
parent_location = intent.extras.getString("locationdata")
)
println(new_parent.tostring())
如前所述,您有一个错字。toString
返回对象的哈希代码,除非它被重写以返回其他内容。查找原始实现以获取更多详细信息。
通过重写toString
方法,您可以更改它返回的内容,并通过它更改print(someClass)
时打印的内容。DVarga在他们的回答中表明了这一点。
数据类自动生成包含类内容的toString
方法。因此,创建数据类是获取包含数据的输出的快捷方式。
您拥有的方法不起作用的原因是您没有调用它。 如果您调用它而不是toString
,则会打印数据。
此外,打印类时会显式调用toString
。你不需要打电话给print(someInstance.toString())
,print(someInstance)
就足够了。
当我写一个答案时,你不需要在 Kotlin 中使用辅助构造函数。主构造函数将显著缩短代码,无论它是否是数据类。此外,您应该研究命名约定。