如果我有抽象类A用init方法:Init方法继承
abstract class A(){
init {
println("Hello")
}
}
然后B类,其延伸甲
class B(): A()
如果我实例乙这样
fun main(args: Array<String>){
B()
}
A中的init方法是否仍然运行并打印出Hello
?
如果不是,我需要做些什么来让A的init方法运行?
如果我有抽象类A用init方法:Init方法继承
abstract class A(){
init {
println("Hello")
}
}
然后B类,其延伸甲
class B(): A()
如果我实例乙这样
fun main(args: Array<String>){
B()
}
A中的init方法是否仍然运行并打印出Hello
?
如果不是,我需要做些什么来让A的init方法运行?
是的,基类的init
块在派生类实例初始化时运行。
在科特林,类似于Java中,一个类的实例在以下方式构造:
的对象被分配。
该类的构造函数被调用。 的(a)
如果类具有超类,执行类构建逻辑单元之前超类构造函数被调用;
(即,点(a)中递归为超类执行时,则执行从这里继续)
如果类具有属性初始化或init
块,它们在相同的顺序执行他们出现在课堂上;
如果构造函数有一个正文(即它是一个secondary constructor),那么正文被执行。
在此描述中,你可以看到,当B
构造,执行B
初始化逻辑之前的A
的构造函数被调用,并且,特别的A
所有init
块被执行。
一个小的话就术语:init
块实际上不是一个单独的方法。相反,所有init
块与成员属性初始值设定项一起编译到构造函数的代码中,所以它们应该被认为是构造函数的一部分。
感谢您的演示! –
这个问题基本上是问如何运行一段代码。只是在沙箱中检查结果会不会更有效率? http://try.kotlinlang.org/ – voddan