如何从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 中通常也不使用分号,尽管如果使用它们不会破坏编译。

name = "ABC" 只是无效的语法,无论是 Java 还是 Kotlin。 实际上它是(来自@hotkey):https://kotlinlang.org/docs/reference/functions.html#named-arguments

【讨论】:

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中的类实例化对象的主要内容,如果未能解决你的问题,请参考以下文章

java中的实例化对象有啥用???????

Kotlin Multiplatform (KMM) 中的对象在 Swift 函数中实例化。函数结束它的作用域。谁释放了对象?

C++只能实例化1个对象的类

抽象类不能实例化对象

Jackson JSON 库:如何实例化包含抽象字段的类

C#为啥接口可以实例化一个实现该接口的类?