2017-05-03 117 views
2

如果我有抽象类A用init方法:Init方法继承

abstract class A(){ 
    init { 
    println("Hello") 
    }  
} 

然后B类,其延伸甲

class B(): A() 

如果我实例乙这样

fun main(args: Array<String>){ 
    B() 
} 

A中的init方法是否仍然运行并打印出Hello

如果不是,我需要做些什么来让A的init方法运行?

+0

这个问题基本上是问如何运行一段代码。只是在沙箱中检查结果会不会更有效率? http://try.kotlinlang.org/ – voddan

回答

8

是的,基类的init块在派生类实例初始化时运行。

在科特林,类似于Java中,一个类的实例在以下方式构造:

  1. 的对象被分配。

  2. 该类的构造函数被调用。 的(a)

    1. 如果类具有超类,执行类构建逻辑单元之前超类构造函数被调用;
      (即,点(a)中递归为超类执行时,则执行从这里继续)

    2. 如果类具有属性初始化或init块,它们在相同的顺序执行他们出现在课堂上;

    3. 如果构造函数有一个正文(即它是一个secondary constructor),那么正文被执行。

在此描述中,你可以看到,当B构造,执行B初始化逻辑之前的A的构造函数被调用,并且,特别的A所有init块被执行。

(runnable demo of this logic)


一个小的话就术语:init块实际上不是一个单独的方法。相反,所有init块与成员属性初始值设定项一起编译到构造函数的代码中,所以它们应该被认为是构造函数的一部分。

+0

感谢您的演示! –