Scala 类(vala:Int)和类(a:Int)之间的区别是什么?

Scala 类(vala:Int)和类(a:Int)之间的区别是什么?,scala,class,Scala,Class,class(val a:Int)和class(a:Int)之间有什么区别 从反编译的代码中,我可以看到在类(val a:Int)版本中,有一个a的访问器。 但是与更高层次的区别是什么?(我的意思是从语义层面) 欢迎提供任何提示。class(a:Int)将a定义为类的默认构造函数的参数 class(val a:Int)定义一个公共字段a,该字段由类的默认构造函数的参数设置类(a:Int)将a定义为类的默认构造函数的参数 class(val a:Int)定义了一个公共字段a,该字段由类的默认构造函数

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

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

欢迎提供任何提示。

class(a:Int)
将a定义为类的默认构造函数的参数

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


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

通过几个简单的示例类可以很好地说明主要区别:

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
X类(a:Int)
Y类(val a:Int)
val x=新的x(1)
x、 a
//:28:错误:值a不是X的成员
//x.a
val y=新y(2)
y、 a
//res1:Int=2

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

通过几个简单的示例类可以最好地说明主要区别:

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
X类(a:Int)
Y类(val a:Int)
val x=新的x(1)
x、 a
//:28:错误:值a不是X的成员
//x.a
val y=新y(2)
y、 a
//res1:Int=2

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

高级区别在于
a:Int
意味着
a
仅在类内部可见,而
val a:Int
意味着
a
在类外部和子类中也是可见的

注意:这只影响外部可见性;即使不是
val
,也可以在类中使用
a
,因为
a
的范围是整个类定义

例如,这是有效的Scala:

class A(a: Int) {
  def apply(b: Int) = a*b
}
还要注意的是,
a
在这两种情况下都不能重新分配,即使它没有标记为
val


实际上,
a
的值总是在类中,但是如果声明
val

,Scala只会生成一个
get
方法。高级区别在于
a:Int
意味着
a
仅在类中可见,而
val a:Int
意味着
a
在类外部和子类中也是可见的

注意:这只影响外部可见性;即使不是
val
,也可以在类中使用
a
,因为
a
的范围是整个类定义

例如,这是有效的Scala:

class A(a: Int) {
  def apply(b: Int) = a*b
}
还要注意的是,
a
在这两种情况下都不能重新分配,即使它没有标记为
val

实际上,
a
的值总是在类中,但是Scala只有在声明
val
时才会生成
get
方法