首页 > 编程语言 > 详细

scala 构造顺序与java 的构造顺序的区别

时间:2015-11-03 02:15:33      阅读:345      评论:0      收藏:0      [点我收藏+]
有如下scala代码?
ConstructionOrder.scala
package quickanswer.chapter8

class Creature {
  val range: Int = 10
  val env: Array[Int] = new Array[Int](this.range)///calls the range() 方法而不是对字段的的直接引用  和java 的区别
}

class Ant extends Creature {
  override val range = 2
}

object ConstructionOrder extends App {
  val ant= new Ant
   println(ant.range);
  println(ant.env.length);

}
?
执行结果是
2
0
?
有如下java 代码?ConstructionOrder.scala
CreatureJava.java
package quickanswer.chapter8;

class CreatureJava {
     int range=10;
     int[] env = new int[range];

     public int getRange() {
        return range;
    }

}
class AntJava extends CreatureJava {

     int  range = 2;

    @Override
    public int getRange() {
        return range ;
    }

}
public class ConstructionOrderJava {

    public static void main(String[] args) {
        AntJava a=new AntJava();
        System.out.println(a.range);
        System.out.println(a.env.length);

    }

}
?
执行结果是
2
10
?
太奇怪了,scala 输出的结果和java 的输出结果竟然不一样
为什么会这样?
?
通过反编译Creature.class(scala编译生成的) 文件 ,得到如下代码
?
public class Creature
{
  public int range()
  {
    return this.range;
  }

  private final int range = 10;

  public int[] env()
  {
    return this.env;
  }

  private final int[] env = new int[range()];
}
?
发现:private final int[] env = new int[range()];
原来scala 中,就算是代码中宿主类中对 ?range的字段的访问是直接访问的,但是是通过scala编译后却是通过方法range() ?(相同于java中的getter)来访问的。
?
所以在如上对Ant类 生成对象的构造过程如下:
?

1. The?Ant?constructor calls the?Creature?constructor before doing its own construction.

2. The?Creature?constructor sets?its?range?field to?10.

3. The?Creature?constructor, in order to initialize the?env?array, calls the?range()?getter.

4. That method is overridden to yield the (as yet uninitialized)?range?field of the?Ant?class.

5. The?range?method returns?0. (That is the initial value of all integer fields when an object is allocated.)

6.?env?is set to an array of length?0.

7. The?Ant?constructor continues, setting its?range?field to?2.

?
?
?
补充:
1、如上内容是对 《快学scala》8.10 构造顺序和提前定义 ?这一节的疑惑的测试与探究
?
?
2、对变量的访问,scala 和java 是不同的,通过javap发现,scala 是方法 invokemethod
,而java 是getField?
?

?

scala 构造顺序与java 的构造顺序的区别

原文:http://zhouchaofei2010.iteye.com/blog/2253923

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!