如何从kotlin中的类实例化对象
Posted
技术标签:
【中文标题】如何从kotlin中的类实例化对象【英文标题】:how to instantiate an object from a class in kotlin 【发布时间】:2019-02-14 03:54:18 【问题描述】:我正在学习 Kotlin,我在 google 上搜索了如何在 kotlin 中创建一个类。所以,我创建了下面的类作为测试。 在主要活动中,我试图从 Board 类实例化一个对象,但出现以下错误:
classifier Board does not have a companion object
请告诉我如何实例化类 Board 的对象?
MainActivity:
class ActMain : AppCompatActivity()
override fun onCreate(savedInstanceState: Bundle?)
super.onCreate(savedInstanceState)
setContentView(R.layout.layout_act_main)
Board board = new Board(name = "ABC");
Board.kt:
data class Board(val name: String)
var age: Int = 0
【问题讨论】:
这不是有效的 Kotlin 【参考方案1】:Kotlin 不使用new
。
Board board = new Board(name = "ABC");
不正确。使用
val board = Board("ABC")
您的代码反映了 Java 语法...有点。 Kotlin 具有类型推断功能,因此您无需指定类类型。但是,如果您指定它,它与 Java 不同:
val board: Board = Board("ABC")
在 Kotlin 中通常也不使用分号,尽管如果使用它们不会破坏编译。
实际上它是(来自@hotkey):https://kotlinlang.org/docs/reference/functions.html#named-argumentsname = "ABC"
只是无效的语法,无论是 Java 还是 Kotlin。
【讨论】:
name = "ABC"
实际上是在 Kotlin 中传递参数的正确方法,请参阅语言参考中的 Functions / Named Arguments。
在一行代码中放置多个语句或表达式时,Kotlin 中需要使用分号。【参考方案2】:
与 Java 不同,在 Kotlin 中这是正确的方式
MainActivity.kt
class ActMain : AppCompatActivity()
override fun onCreate(savedInstanceState: Bundle?)
super.onCreate(savedInstanceState)
setContentView(R.layout.layout_act_main)
val board = Board("ABC")
board.age = 12
Board.kt
class Board(val name: String)
var age: Int = 0
【讨论】:
【参考方案3】:试着忘记java
val board = Board("name")
【讨论】:
【参考方案4】:在科特林中
当你想声明新对象时,你可以这样做。
val board = Board("ABC")
如果您使用 val 关键字声明对象。它看起来就像您在 java 中使用 final 一样。您声明的变量无法重新创建。
var board = Board("ABC")
如果你使用 var 来声明它在 java 中看起来像普通变量
无论如何,在 kotlin 中你会看到一些它在 java 中不包含的东西,例如 范围功能如下面的链接。它将帮助您更轻松地编写代码。
https://kotlin.guide/scoping-functions
希望对你有所帮助:)
【讨论】:
以上是关于如何从kotlin中的类实例化对象的主要内容,如果未能解决你的问题,请参考以下文章
Kotlin Multiplatform (KMM) 中的对象在 Swift 函数中实例化。函数结束它的作用域。谁释放了对象?