我知道这是一个非常基本的问题,但是对此的回答将解决我的许多疑问。
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并访问各个字段,并输出空字符串(初始化方式)。
我们如何解释呢?
答案 0 :(得分:1)
您是否检查过从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())
答案 1 :(得分:1)
据我所知,您的问题是调用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)
这是因为data classes覆盖了toString()
函数:
编译器自动从所有派生以下成员 在主要构造函数中声明的属性:
- equals()/ hashCode()对;
- toString(),格式为“ User(name = John,age = 42)”;
答案 2 :(得分:1)
如上所述,您有错字。 toString
返回对象的哈希码,除非覆盖该对象的哈希码以返回其他内容。查找原始实现以获取更多详细信息。
通过覆盖toString
方法,您可以更改返回的内容,并由此更改print(someClass)
时显示的内容。 DVarga在他们的回答中表明了这一点。
Data classes自动生成一个包含类内容的toString
方法。因此,创建数据类是获取包含数据的输出的捷径。
您使用的方法不起作用的原因是因为您没有调用它。如果调用它而不是toString
,则会得到打印的数据。
此外,在打印类时,将显式调用toString
。您无需致电print(someInstance.toString())
,print(someInstance)
就足够了。
在我写答案时,您不需要在Kotlin中使用辅助构造函数。无论是不是数据类,主构造函数都会大大缩短您的代码。另外,您应该研究命名约定。