Scala 中 构造函数,重载函数的执行顺序
在调试scala在线开发教程(http://www.imobilebbs.com/wordpress/archives/4911)的过程中看到了以下代码,但是这段代码无论怎么调试都无法成功。
abstract class Element{
def contents:Array[String]
val height:Int = contents.length
val width:Int = if(height==0) 0 else contents(0).length
} class UniformElement (ch :Char,
override val width:Int,
override val height:Int
) extends Element{
private val line=ch.toString * width
def contents = Array.fill(height)(line)
} val ue = new UniformElement('x',2,3)
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 中重载函数的执行要先于构造函数的执行 。 为了验证想法,对代码做了以下改动:
abstract class Element{
def contents:Array[String]
val height:Int = contents.length
val width:Int = if(height==0) 0 else contents(0).length
} class UniformElement (ch:Char,
override val width:Int,
override val height:Int
) extends Element{
val line = ch.toString * width
println("Initialize done")
def contents:Array[String] = {
println("override done")
Array.fill(height)(ch.toString * width)
}
//def cons:Array[String] = Array.fill(height)(line)
} val ue = new UniformElement('x',2,3)
运行结果如下:事实说明Scala 中重载函数的执行要先于构造函数的执行。但是没搞明白为什么重载函数执行了两遍。
Scala 中 构造函数,重载函数的执行顺序的更多相关文章
- Unity 脚本中的主要函数的 执行顺序及其介绍
Awake ->OnEable-> Start -> FixedUpdate-> Update -> LateUpdate ->OnGUI ->OnDisa ...
- Unity3d中MonoBehavior默认函数的执行顺序和生命周期
Awake()在MonoBehavior创建后就立刻调用,在脚本实例的整个生命周期中,Awake函数仅执行一次:如果游戏对象(即gameObject)的初始状态为关闭状态,那么运行程序,Awake函数 ...
- C#继承中构造函数,成员变量的执行顺序
public class Animal { static string baseClassName; protected string _skincolor; Instancevariable iv ...
- Unity3D中默认函数的执行顺序
直接用一张图来说明各个默认函数的执行顺序: FixedUpdate以固定的物理时间间隔被调用,不受游戏帧率影响.一个游戏帧可能会调用多次FixedUpdate.比如处理Rigidbody的时候最好用F ...
- Tip8:Unity中诸如 Awake() Start() Update()等函数的 执行顺序
Unity脚本中有很多的事件函数,下面是各种函数的执行顺序: 1.reset(); 2.Awake(); 3.OnEnable; 4.OnLevelWasLoaded(); 5.Start(); 6. ...
- 界面主窗体,子窗体的InitializeComponent(构造函数)、Load事件执行顺序
主窗体,子窗体的InitializeComponent(构造函数).Load事件执行顺序1.执行主窗体定义事件 new函数时,同时执行主窗体构造函数,默认就一个InitializeComponent函 ...
- C# 静态构造函数,静态变量执行顺序(升华版)
上篇 是基本语法基础下的执行顺序,包括继承这个维度下的执行顺序,我们可以依照的规律顺下来,下面我们看下一些摸不到头脑的情况 我们实验 一个 类中的方法 去调用另一个非继承类的情况, 我们主要看下 ...
- java中子类继承父类程序执行顺序
java中子类继承父类程序执行顺序 FatherTest.java public class FatherTest { private String name; public FatherTest() ...
- unity3D技术之事件函数的执行顺序[转]
unity3D技术之事件函数的执行顺序 转自http://www.yxkfw.com/?p=13703 在unity的脚本,有大量的脚本执行按照预先确定的顺序执行的事件函数.此执行顺序说明如下: ...
随机推荐
- VC++ 如何在显示对话框的时候,指定焦点控件!
很简单: 在你的CAddDlg类的OnInitDialog函数中加上你上面的代码GetDlgItem(IDC_EDIT1)->SetFocus();最后记得return FALSE; 其实,不知 ...
- yii学习第一课 《命名空间》
<?php namespace a\b\c; class Apple { function getInfo() { echo 'this is a<br>'; } } <?ph ...
- strcat strcpy 使用出现的问题汇总
事例1(转) 在程序中多次用的strcat函数,但是有时候编译通过,但是执行时却出现了错误.为了进一步了解strcat函数的使用,我首先写了这样的一个测试程序: main(){ char ...
- 超链接的那些事(二): 属性href
a标签的属性之一 href 1. 定义 href 属性用于指定超链接目标的 URL. 2. 用法 ①. 锚点 同一页面添加锚点 (1)<a href="#test"& ...
- iOS button 里边的 字体的 摆放
button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft; button.titleEdgeInsets ...
- win7 64位 mongodb2.6.0 安装服务启动
Workaround to install as a service You can manually install 2.6.0 as a service on Windows from an Ad ...
- [转] MovieClip转Bitmap方法
package { import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.Loader; ...
- 在windows环境下基于sublime text3的node.js开发环境搭建
首先安装sublime text3,百度一堆,自己找吧.理论上sublime text2应该也可以.我只能说一句:这个软件实在是太强悍了. 跨平台,丰富的插件体系,加上插件基本上就是一个强悍的ide了 ...
- Git克隆
用法1:Git clone <repository> <directory> 将<repository>指向的版本库创建一个克隆到<directory> ...
- NC WebService接口开发流程
一.定义类: 接口类 包定义在public下,接口类名为I开头,Service结尾 实现类 包定义在private下,实现类名以ServiceImpl结尾 VO类 若有VO类,也放在public下 U ...