Scala 中 构造函数,重载函数的执行顺序

在调试scala在线开发教程(http://www.imobilebbs.com/wordpress/archives/4911)的过程中看到了以下代码,但是这段代码无论怎么调试都无法成功。

 1   abstract class Element{
 2     def contents:Array[String]
 3     val height:Int = contents.length
 4     val width:Int = if(height==0) 0 else contents(0).length
 5   }
 6
 7 class UniformElement (ch :Char,
 8   override val width:Int,
 9   override val height:Int
10 ) extends Element{
11   private val line=ch.toString * width
12   def contents = Array.fill(height)(line)
13 }
14
15 val ue = new UniformElement(‘x‘,2,3)
16   println(ue.contents)

错误如下:
Exception in thread "main" java.lang.NullPointerException

分析原因如下:

以上代码的12行 12   def contents = Array.fill(height)(line) 引用了第11行定义的变量line: private val line=ch.toString * width. 按理说在执行12行的时候,line应该已经被初始化了。而实际上在执行12行的时候,line 依然是null. 所以导致了上面的异常。
可能的原因就是Scala 中重载函数的执行要先于构造函数的执行 。 为了验证想法,对代码做了以下改动:

 1   abstract class Element{
 2     def contents:Array[String]
 3     val height:Int = contents.length
 4     val width:Int = if(height==0) 0 else contents(0).length
 5   }
 6
 7   class UniformElement (ch:Char,
 8                         override val width:Int,
 9                         override val height:Int
10                          ) extends Element{
11     val line = ch.toString * width
12     println("Initialize done")
13     def contents:Array[String] =  {
14       println("override done")
15       Array.fill(height)(ch.toString * width)
16     }
17     //def cons:Array[String] = Array.fill(height)(line)
18   }
19
20   val ue = new UniformElement(‘x‘,2,3)

运行结果如下:事实说明Scala 中重载函数的执行要先于构造函数的执行。但是没搞明白为什么重载函数执行了两遍。

时间: 2024-10-12 01:16:34

Scala 中 构造函数,重载函数的执行顺序的相关文章

Unity3D中组件事件函数的执行顺序

事件函数的执行顺序 Unity 脚本中有许多按预设顺序以脚本身份运行的事件函数.其执行顺序如下: 加载第一个场景 启动场景时调用这些函数(为场景中的每个对象调用一次). Awake: 始终在调用任何 Start 函数之前和实例化预设之后调用此函数.(如果游戏对象 (GameObject) 在启动期间处于非活动状态,则直到其处于活动状态时或调用添加至其本身的任何脚本中的函数时,再调用 Awake 函数.) OnEnable: (仅当对象 (Object) 处于活动状态时调用此函数):程序会在启用该

Unity 脚本中的主要函数的 执行顺序及其介绍

Awake ->OnEable-> Start -> FixedUpdate-> Update  -> LateUpdate ->OnGUI ->OnDisable ->OnDestroy 1.Awake 用于在游戏开始之前初始化变量或游戏状态.在脚本整个生命周期内它仅被调用一次.Awake在所有对象被初始化之后调用,所以你可以安全的与其他对象对话或用诸如GameObject.FindWithTag()这样的函数搜索它们.每个游戏物体上的Awake以随机的顺

C#继承中构造函数,成员变量的执行顺序

public class Animal { static string baseClassName; protected string _skincolor; Instancevariable iv = new Instancevariable("父类实例成员变量"); static Instancevariable siv = new Instancevariable("父类静态成员变量"); static Animal() { baseClassName = &

jqMobile中pageinit,pagecreate,pageshow等函数的执行顺序

常见的共有5个page函数,刚开始有点迷糊的是到底谁先谁后执行. 实验告诉我们结果: var temp = ''; $('body').live('pagechange', function () { temp += 'pagechange,\n'; console.log (temp); }) $('body').live('pagecreate', function () { temp += 'pagecreate,\n'; console.log(temp); }) $('body').l

Tip8:Unity中诸如 Awake() Start() Update()等函数的 执行顺序

Unity脚本中有很多的事件函数,下面是各种函数的执行顺序: 1.reset(); 2.Awake(); 3.OnEnable; 4.OnLevelWasLoaded(); 5.Start(); 6.OnApplicationPause(); 7.FixedUpdate(); 8.Update(); 9.LateUpdate(); 10.Rendering(渲染)类 11.Coroutines(协调程序)类 12.OnDestroy(); 13.OnApplicationQuit(); 14.O

MFC程序中消息以及函数的处理顺序简介[转]

MFC应用程序中处理消息的顺序 1.AfxWndProc()      该函数负责接收消息,找到消息所属的CWnd对象,然后调用AfxCallWndProc 2.AfxCallWndProc()  该函数负责保存消息(保存的内容主要是消息标识符和消息参数)供应用程序以后使用,                    然后调用WindowProc()函数 3.WindowProc()      该函数负责发送消息到OnWndMsg()函数,如果未被处理,则调用DefWindowProc()函数 4.

关于多个Promise对象及then()函数的执行顺序的研究记录

今天终于想要研究一下多个 Promise 对象的执行顺序问题了,在研究完后记录一下. 我想研究的是以下问题: 1.多个 Promise 对象及其then函数的执行顺序,这里不研究处于不同状态的 Promise 对象的执行顺序 2.在 Promise 中的定时器延时问题(这个问题其实在 MDN 和阮一峰老师的 ES6 入门中都讲过,只是我光看文字有点晕,所以自己写代码来理解) 废话不多说,先上代码吧 // 延时执行 new Promise(resolve => setTimeout(() =>

事件函数的执行顺序

 事件函数的执行顺序 在unity的脚本,有大量的脚本执行按照预先确定的顺序执行的事件函数.此执行顺序说明如下: Editor Reset: Reset调用来初始化脚本的属性,当它第一次附加到该对象,并且使用Reset命令时. 第一次Scene Load scene启动 (一次为每个场景中的对象) 时,会调用这些函数. Awake:此函数始终是开始任何职能之前调用,并且也是在一个预置实例化之后.(如果一个游戏对象处于非活动状态,Awake不会被调用当被激活时 或者一个附加到游戏对象的任何脚本

unity3D技术之事件函数的执行顺序[转]

unity3D技术之事件函数的执行顺序 转自http://www.yxkfw.com/?p=13703 在unity的脚本,有大量的脚本执行按照预先确定的顺序执行的事件函数.此执行顺序说明如下: Editor Reset: Reset调用来初始化脚本的属性,当它第一次附加到该对象,并且使用Reset命令时. 第一次Scene Load scene启动 (一次为每个场景中的对象) 时,会调用这些函数. Awake:此函数始终是开始任何职能之前调用,并且也是在一个预置实例化之后.(如果一个游戏对象处