当前位置: 首页 > 知识库问答 >
问题:

kotlin中的init block和构造函数有什么区别?

长孙和悦
2023-03-14

我已经开始学习科特林了。我想知道 init 块和构造函数之间的区别。这与我们如何使用它来改进有什么区别?

class Person constructor(var name: String, var age: Int) {
    var profession: String = "test"

    init {
        println("Test")
     }    
}

共有3个答案

康文昌
2023-03-14

Kotlin类中的类a主构造函数(类名后面的那个)不包含代码,它只能初始化属性(例如< code > class X(var prop:String))。

位置的 init{..} 块, 您可以在其中放置更多将要运行的代码 初始化属性后 :

初始化器块的执行顺序与它们在类主体中出现的顺序相同,与属性初始化器交错

更多关于这方面的信息在https://kotlinlang.org/docs/reference/classes.html#constructors

这里有一个例子:



class X(var b: String) {
  val a = print("a")

  init {
    print("b")
  }

  constructor() : this("aaa") {
    print("c")
  }
}


X()

调用时,它会打印abc。因此init{…}在主构造函数之后但在辅助构造函数之前调用。

公西运良
2023-03-14

因为

主构造函数不能包含任何代码。

https://kotlinlang.org/docs/reference/classes.html

< code>init{..}块允许向主构造函数添加代码。

督烨赫
2023-03-14

init块将在主构造函数之后立即执行。初始值设定项块实际上成为主构造函数的一部分。

构造函数是辅助构造函数。委托给主构造函数是辅助构造函数的第一个语句,因此所有初始化程序块中的代码都在辅助构造函数主体之前执行。

class Sample(private var s : String) {
    init {
        s += "B"
    }
    constructor(t: String, u: String) : this(t) {
        this.s += u
    }
}

认为您初始化了示例类

Sample("T","U")

您将在变量s处得到一个字符串响应,如< code >“TBU”。

“T”从示例类的主构造函数分配给s
然后立即开始执行init块;它将向s变量添加“B”
下一步是二级构造器回合;现在,“U”被添加到s变量中,成为“TBU”

 类似资料:
  • 本文向大家介绍class和普通构造函数有什么区别?相关面试题,主要包含被问及class和普通构造函数有什么区别?时的应答技巧和注意事项,需要的朋友参考一下 构造函数可以当作普通的函数调用,而class 只能使用new 关键字调用 class 内部默认启用严格模式 class 不存在变量提示(函数提交)在定义class前使用new调用会出错 class 内部定义的方法和属性都是不可以遍历的。 cla

  • 问题内容: 我知道,,,,,和其他一些人都没有的功能,但语言结构。 这些语言构造中的一些需要括号,而其他则不需要。 有些具有返回值,有些则没有。 那么语言构造和内置函数之间的 内部 区别是什么? 问题答案: (这比我打算的要长;请耐心等待。) 大多数语言由一种称为“语法”的东西组成:该语言由几个定义明确的关键字组成,并且您可以用该语言构造的完整表达范围都是由该语法建立的。 例如,假设您有一个简单的

  • 实际上,我不明白无参数构造函数和默认构造函数的区别是什么。 在创建名为cFrame的Test对象时,是否调用此类的默认构造函数?

  • 无论我用什么方法尝试,无论是主构造函数还是次构造函数,我都不知道如何在kotlin中声明一个带有超类和构造函数的新类。 这是我最想做的,但它给出了一个错误,期望成员声明。 这是我认为主要构造函数的外观,但它给出了相同的错误。在Internet上搜索没有帮助,我只能找到第二个示例。 那么,用一个超类和它的一个构造函数创建一个类的所有有效方法是什么呢?

  • 问题内容: 我试图了解Java枚举是如何工作的,我得出的结论是,它与将其构造函数声明为private的普通Java类非常相似。 我刚刚得出这个结论,它并不是基于太多的思考,但是我想知道我是否错过了任何事情。 因此,下面是一个简单的Java枚举和一个等效的Java类的实现。 上面和下面的代码在含义上有什么区别? 问题答案: 差异: 枚举扩展并获得其所有不错的功能: 通过正确的序列化自动实现单例行为

  • 我正在将我的一些Java代码转换为Kotlin,我不太明白如何实例化Kotlin代码中定义的接口。作为一个例子,我有一个接口(用Java代码定义): 然后在我的Kotlin代码中,我进一步实例化了这个接口: 而且效果很好。然而,当我将MyInterface转换为Kotlin时: 当我尝试实例化接口MyListener时,我得到了一条错误消息:-尽管在我看来除了语法之外没有什么变化。我是否误解了Ko