码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-07-30 18:49:34      阅读:255      评论:0      收藏:0      [点我收藏+]

标签:

在调试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 中重载函数的执行要先于构造函数的执行。但是没搞明白为什么重载函数执行了两遍。

技术分享

 

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

标签:

原文地址:http://www.cnblogs.com/1zhk/p/4689453.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!