class(val a: Int)
和class(a: Int)
之间的区别是什么?
从反编译代码中我可以看到class(val a: Int)
版本中有a
的访问者。
但是更高层次的区别是什么?(我的意思是语义层面)
任何提示都表示赞赏。
答案 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
的默认构造函数的参数设置