Class 无法打印模型实例的值

Class 无法打印模型实例的值,class,object,constructor,kotlin,Class,Object,Constructor,Kotlin,我知道这是一个非常基本的问题,但对这个问题的回答将解决我的许多疑问 val new_parent = ParentDetails(intent.extras.getString("name"), intent.extras.getString("email"), intent.extras.getString("parent_relation"), intent.extras.getString("locationdata")) println(new_parent.

我知道这是一个非常基本的问题,但对这个问题的回答将解决我的许多疑问

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并访问单个字段,它打印空字符串(初始化的方式)


我们如何解释这一点?

您是否检查了您是否从您的
意图中收到了有效的数据。额外的

此外,我建议您为您的模型使用
数据类
。 它看起来像这样:

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())

您是否检查是否从您的
intent.extras
接收到有效数据

此外,我建议您为您的模型使用
数据类
。 它看起来像这样:

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())

据我所知,您的问题是调用
println(new\u parent.tostring())
无法打印您希望在函数
parentDetailsSprintMe
中打印的内容

首先,您有一个输入错误,正确的调用应该是
new\u parent.toString()

请注意,它可以简化为
println(新的\u父项)

它不会打印您在
ParentDetailsprintme
方法中定义的内容,因为该方法未被调用

println(new_parent.toString())
prints实际上是对象的hashcode,因为这是每个对象的默认行为

要使其正常工作,请像调用
println(new\u 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的函数只是在引擎盖下调用
System.out.println(message)
,它将调用
String.valueOf()
(例如,对于对象,它将调用传递对象的
toString()
方法)


更新(“使用数据类方法也有效”):

如果将该类设置为数据类:

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()
函数:

编译器自动从所有 在主构造函数中声明的属性:

  • 等于()/hashCode()对
  • “User(name=John,age=42)”形式的toString()

据我所知,您的问题是调用
println(new\u parent.tostring())
无法打印您希望在函数
parentDetailsSprintMe
中打印的内容

首先,您有一个输入错误,正确的调用应该是
new\u parent.toString()

请注意,它可以简化为
println(新的\u父项)

它不会打印您在
ParentDetailsprintme
方法中定义的内容,因为该方法未被调用

println(new_parent.toString())
prints实际上是对象的hashcode,因为这是每个对象的默认行为

要使其正常工作,请像调用
println(new\u 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的函数只是在引擎盖下调用
System.out.println(message)
,它将调用
String.valueOf()
(例如,对于对象,它将调用传递对象的
toString()
方法)


更新(“使用数据类方法也有效”):

如果将该类设置为数据类:

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()
函数:

编译器自动从所有 在主构造函数中声明的属性:

  • 等于()/hashCode()对
  • “User(name=John,age=42)”形式的toString()

如前所述,您有一个打字错误
toString
返回对象的hashcode,除非它被重写以返回其他内容。有关更多详细信息,请查阅原始实现

通过重写
toString
方法,可以更改它返回的内容,并通过该方法更改
print(someClass)
时打印的内容。德瓦加在他们的回答中表明了这一点

自动生成包含类内容的
toString
方法。因此,创建数据类是获取包含数据的输出的快捷方式

你使用的方法不起作用的原因是你没有调用它。如果您调用它而不是
toString
,您将得到打印的数据

此外,打印类时,会显式调用
toString
。您不需要调用
print(someInstance.toString())
print(someInstance)
就足够了



在我写答案时,您不需要在Kotlin中使用辅助构造函数。无论是否是数据类,主构造函数都会显著缩短代码。此外,您还应该研究命名约定。

如前所述,您有一个输入错误
toString
返回对象的hashcode,除非它被重写以返回其他内容。有关更多详细信息,请查阅原始实现

通过重写
toString
方法,可以更改它返回的内容,并通过该方法更改
print(someClass)
时打印的内容。德瓦加在他们的回答中表明了这一点

自动生成包含类内容的
toString
方法。因此,创建数据类是获取包含数据的输出的快捷方式

你使用的方法不起作用的原因是你没有调用它。如果你是c