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
方法