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