class(val a:Int)和class(a:Int)之间有什么区别?

时间:2018-05-02 00:13:27

标签: scala class

class(val a: Int)class(a: Int)之间的区别是什么?

从反编译代码中我可以看到class(val a: Int)版本中有a的访问者。 但是更高层次的区别是什么?(我的意思是语义层面)

任何提示都表示赞赏。

3 个答案:

答案 0 :(得分:4)

使用几个简单的样本类可以最好地说明主要区别:

class X(a: Int)

class Y(val a: Int)

val x = new X(1)
x.a
// <console>:28: error: value a is not a member of X
//        x.a

val y = new Y(2)
y.a
// res1: Int = 2
a中的

X仅仅是构造函数参数,不能被视为类成员,而类val a中的Y同时充当构造函数参数和类成员。

答案 1 :(得分:3)

高级差异是a: Int表示a仅在里面类中显示,而val a: Int表示a表示也可以看到外部类和子类。

注意:这只会影响外部可见度;您仍然可以在类方法中使用a,即使它不是val,因为a的范围是整个类定义。

例如,这是有效的Scala:

class A(a: Int) {
  def apply(b: Int) = a*b
}

另请注意,在任何一种情况下都无法重新分配a,即使它未标记为val

在实践中,a的值始终在类中,但如果声明get,Scala将只生成val方法。

答案 2 :(得分:1)

class(a: Int)将一个参数定义为class

的默认构造函数

class(val a: Int)定义了一个公共字段a,它由class的默认构造函数的参数设置